2014/11/17

Spotlight 復旧作業

Time Machineの調子が悪いと思ったら,Spotlight を疑うべし?かどうかは分からないけど,少なからず関係しているなという印象.Time Machineの復旧が先だったので,とりあえずそこまでは前回こぎつけた.次は Spotlight をなんとかしたい.

結構危ないことをやっていると思うので,USB メモリなどを挿して,その中に対して実験してからの方が無難です.

「索引作成にかかる時間を計算中」のまま,数日経っても進まないという状況.
恐らく,原因と思しきところは, /.Spotlight-V100/ が101GBもあること.これが何をするフォルダかは分からないが,一旦消して再構築できれば進む気がする.

ただ,Inforati の手順(Mac Spotlightの検索インデックスのデータベースを再作成する方法)に出てくる sudo mdutil -E device では,このディレクトリは消えてくれなかった.
(locak diskに対しては, mdutil -E / となる.USB等だと, mdutil -E /Volumes/xxx)
ただ,USB メモリで -E をすると,Spotlight の検索結果が一度消えて,また検索できるようになる(索引が再作成されるのだろう)ことが確認できた.で,試しに(*USBで!), /Volumes/xxx/.Spotlight-V100 を削除(/Volumes/xxx/Spotlight-V100へのrenameにしておいた)して, mdutil -E したところ, .Spotlight-V100 が再生成されて,検索も使えた.

上記手順をそのまま / に対して実行して,「索引作成にかかる時間を計算中」は無事脱出.「残り約6時間」となった.

これで,Time Machine と Spotlight が共存してくれるかどうか...
念のため(というか,基本的に不要なので),ファイルが多いディレクトリは Spotlight の対象外(環境設定からSpotlight→プライバシで指定)にした.

2014/11/12

Time Machineのバックアップが始まらない(Spotlightの罠)

Time Machineによるバックアップがしばらく作成されないという症状に出くわしました.そほれほどファイルがない Mac Book Air (10.8)は特段問題ないのですが,数十万ファイルの追加・更新がたまに発生するMac Pro (10.9)は数週間完全にバックアップされていない期間が続いていました.改めて手動でバックアップを指示しても,週末(48時間以上)経ってもバックアップが始まらない.

これはやばいということで,バックアップする外部ディスクを新しいものに変えました.とりあえず,ファイル数は多いものの初期のバックアップは成功.しばらく1時間毎のバックアップも作成されていましたが,ちょっとした解析で数十万ファイルを更新したらバックアップが始まらない症状が再発.

諦めて新DISKを一度まっさらに(フォーマット)して,再度Time Machineを開始するも,,,30時間経っても「バックアップを準備中…」のまま...

再起動直後の1回目はちゃんとバックアップされることもあったけど,ダメな時もあるので根本の解決にはならず(というか,都度再起動は無理だし).

Appleサポートに参考になりそうな回答があった.

Spotlightをoffにする!?
確かに,この症状を発症すると,Spotlightで検索しても答えが返ってこなくなる.Time Machineにしても,Spotlight にしてもファイル探索なのでI/Oに負荷がかかっててしかたがないのかなぁ...と漠然と思ってたのですが,Spotlight を off にして解決した方もいる模様.

ちなみに,この時点では,コンソール.app で backupd で絞り込みをかけても何も出てこない(Airの方はそれなりに出てるけど,エラーはなさそう).

Spotlightの対象DISKから外す方法→「システム環境設定」→「Spotlight」→「プライバシー」(タブ)から,ファイル数が多いディレクトリを検索対象から除外した.

とすると,まずはSpotlightをなんとかした方が良いのか.
というわけで,Mac Spotlightの検索インデックスのデータベースを再作成する方法を参照すると,メニューバーでインデックス作成中の様子が見えるじゃないですか...Mac OS使うようになって何年経ってるんだ....と思うような基本的な無知.見ると,「索引作成にかかる時間を計算中」で明らかに固まってる.まずはこいつをなんとかせんにゃあかんね.

というわけで,先ほど Spotlight からの除外ディレクトリを指定したけど,上記ブログにあるように,一旦 DISK 全体を対象外にして,まっさらから作りなおしてもらう(ファイルが多いところは除外して)ことにする.実際,ほとんどが png 画像だったり機械的に生成したhtmlなので問題ない.
というか,Time Machineバックアップにしか使ってない外付け DISK まで Spotlight の対象になってたのか!外部 DISK 2つ(新旧 Time Machine)を対象外にして,local DISK も対象外にしたところで,メニューバーを見ると索引作成も動いていない.

そして,除外リストから local disk を外そうとしたら今度は「不明なエラーのため項目の追加または削除ができません」と...そろそろ終わりにしたいんだけど...再起動.環境設定の Spotlight から local disk を除外してちょっとお喋り(?)してる間に「索引作成にかかる時間を計算中」モードに突入.

さて,これでどうなるか...
(現状)
Time Machine → OFF (無用な負荷を減らすため)
  * ただし,1ヶ月程度前のバックアップは古い DISK に出来ている状態(USB接続はしてるけど,Time Machineとしては使っていない).
Spotlight → まっさらにして,索引作成

(追記)
NAVERまとめは色々可能性がまとめられててよさそう(未確認)

(20時間後)
Spotlight の索引作成が,「索引作成にかかる時間を計算中」のまま20時間が経過.Time Machine の方が重要なので,Spotlight の対象から local disk を外して(対象をなしにする)索引作成を止めて,Time Machine のトライに戻る.まずは,ファイルを除外しないでテスト.
Time Machine → ほぼ全てを対象に設定
Spotlight → 停止

結局,Time Machineも簡単には戻ってくれなかった.ので,
・バックアップ先をフォーマット(1ヶ月前のは別のDISKにあるので)
・ほとんどのディレクトリをバックアップ「対象外」に設定
・それでも始まらないので再起動

これで,なんとかTime Machineバックアップが「終了」するようになった.ので,対象外にしたものを1つ1つ戻して,全体(~/tmp/ は前から除外していた)をバックアップ対象にした.これで,Time Machineは復旧.

わかったこと:
・Spotlightとの関係が怪しい
・バックアップディスクを新調して,対象外を増やしたところからコツコツやればなんとかなる
(有益な解決策に見えないが...)

Spotlight はOFFのままなので,いずれやり直したい.少なくとも,/.Spotlight-V100が101GBあるという異常な状態であることは確認した.


2014/10/18

iPad2にiOS8が入らない(解決?)

iOS 8が出たっちゅうことでしたが,完全放置.兎に角今やって動かなくなった場合の対処する時間がないので.と思ってたけど,サブ機材になら入れても良いかなと思えるようになってきたのでトライ.

まずは,iPadモデルの特定方法で機種を特定(記憶力なし).最初に手に入れたやつは,iPad 2(iPad 2 (Wi-Fi):A1395)だったようである.ぎりぎりiPadの最低レベルで対象機種のようである.アップルのページはバージョン変わると書き換わってしまうので,別のリンクも記録.

実はこんな確認をする前から作業は始めてたんだけど,兎に角入らない.以下,状況.

・ソフトウェア・アップデートでフラグ立つ(現OS 7.1.1)
・既に8.0.2がダウンロード済となっていたので実行
・期待していたiCloud Driveの質問も何もなくホーム画面に戻る
・なんか変と思って確認すると,バージョンは変わらず(;_;)
・ソフトウェア・アップデートはフラグなしだけど,候補を探すと8.0.2が出てくる.が,ダウンロードまだしてないよと言われている
・ダウンロードしてアップグレードを選択
・ダウンロードのあと,同意して進むものの,長時間待たされた挙句振り出しに戻る←今3回目トライ中.

iOS 8をiPhone 4SやiPad 2に入れるとどれだけ遅くなるのか?という記事があるくらいだからアップデートそのものは出来ているのだろうが...5GBの空きか...16GBモデルなのでもしやないかもしれない...が,現在あぷで真っ最中で確認できず.

そして,,,3度目の正直.単にアップデートを繰り返したら出来た...なんだったんだ.一番たちの悪い解決方法...同じ状況にはまったら,根気よくということで...

2014/10/01

ロック(排他制御)

cronを使って一定の処理をさせたいとき,毎分に設定したいけどそうすると前の処理が終わっていなくて多重起動されてしまうという問題があります(問題ない場合もあると思いますが).これを制御するのにロックファイルを使っていたのですが,ロックディレクトリにしなきゃダメだと指摘され,修正しました.

if [ -r $lockfile ]; then
  exit 0
else
  touch $lockfile
fi
.... (script) ....
rm $lockfile

[ -r $lockfile ] && exit 0
touch $lockfile

としたくなるわけですが,まったく同時に2つ以上のスクリプトが起動された場合には両方共,ロックファイル($lockfile)が無いので処理が始まってしまいます.

これを避けるには,mkdir等の排他的なシステムコールを使うのだそうです.
mkdir $lockdir 2> /dev/null || exit $?
.... (script) ....
rmdir $lockdir

mkdir は既に $lockdir が存在していた場合はエラーになりますので処理を停止できます.たとえスクリプトが同時に起動されたとしても,mkdirで排他してくれるそうです.

ですが,スクリプトが強制終了された時にロックディレクトリが残ってしまうという問題があります.スクリプトの中で使っているコマンドが異常終了したような場合にはちゃんとロックディレクトリを後始末しましょう.

error() {
  echo $1
  rmdir $lockdir
  exit 1
}
などとしておいて,
./command || error "failed ./command"
のようなエラー制御を入れておけば良いはずです.面倒ですが.

が,それでも,スクリプトが強制終了(たとえば,rebootなどの操作)される可能性もあります.そうすると,もうお手上げでロックディレクトリが常に存在してしまうためスクリプトが動きません.これを回避するために,一定時間以上経過していたらロックディレクトリを消すというロジックもあるようですが,じゃぁ,一定時間はどれくらいだ?という問題が残ります.予期せぬ長時間処理になった場合,どうするかということになります.

が,眼から鱗な解決策が!
lockdir=/dev/shm/xxxx

RAMディスクにロックディレクトリを作成しておけば,rebootが行われた場合でもすっきりとロックファイルを消すことが出来ます.もちろん共有空間ですので,ファイル名のバッティングだけは要注意ですが.

ただし,終了した後のアプリケーションとしてのケアは別途必要ですので悪しからず.


2014/09/11

はぢめてのPython module (PIL)

とあるPythonスクリプトを貰ったら,PILモジュールってのが必要らしい.が,perlならcpanで入れるけど,pythonのモジュールの入れ方知らないぞと...いうわけで,メモ.

スクリプトを実行すると,
ImportError: No module named PIL
と言われる.

こちらのブログを参考にさせて頂いて,本家からダウンロード.OSにあったものをと書かれているが,windowsしかバイナリはなさそうなので,ソースを持ってきた.手元のOSは,Mac OS X 10.8.5 です.Mac Book Airなので,色々な噂に基いて Mavericks にはしてません.

% tar zxvf Imaging-1.1.7.tar.gz
% cd Imaging-1.1.7

BUILDMEを見ると,"for lazy programmers" のための手順として,
% python setup.py build_ext -i
% python selftest.py
となってるのでやっておく.詳しくはREADMEということなので見たところ,
% (sudo) python setup.py install
の前にやっておけということのようです.

FreeTypeが無いらしい
_imagingft.c:73:10: fatal error: 'freetype/fterrors.h' file not found
#include <freetype/fterrors.h>

MacPortsでは入っていたので /opt/local/include あたりを見逃しているのかと思ったら,/opt/local/include/freetype が無くて, /opt/local/include/freetype2 になってるのが原因だった.悩みどころだけど, _imagingft.c を修正した.

無事 selftest.py もパスしたので,ブログの手順にあるように,
% sudo python setup.py install
へ進む.

無事,動いた模様.