ページ

2010年1月7日木曜日

XcodeでSafriの再起動〜シェルスクリプトをビルドフェーズへ追加

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)Cocoaの日々: Xcodeでビルドする時にファイルをコピーする(ビルドフェーズの追加)

前回ビルド時にプラグインをコピーするビルドフェーズを追加した。今回はこれに Safri を再起動するビルドフェーズを追加してみよう。

Safariを再起動するにはシェルスクリプトを使う。Safariの起動は open コマンドを使うとして、停止はどうやればいいのか。特に情報がみつけられなかったので UNIX標準の kill コマンドを使ってみた。

この kill コマンドには引数にPID(Process ID)を渡す必要がある。PIDは ps コマンドで取得できる。

ターミナル.app で "ps -A" を実行した時の結果例。



grep と awk をパイプでつなぎ Safari.app の PID を得る。"grep -v grep" は grep実行自身を除くために入れてある。

$ ps -A|grep Safari.app|grep -v grep|awk '{print $1}'
1487

ただ見ているとたまに Safariは子プロセスを起動しているようで Safari.app だけでは複数のプロセスがヒットする。
$ ps -A|grep Safari.app|grep -v grep
 1487 ??         2:04.69 /Applications/Safari.app/Contents/MacOS/Safari -psn_0_606356
 1503 ??         0:24.18 /Applications/Safari.app/Contents/Safari Webpage Preview Fetcher /Users/hashi/Library/Caches/com.apple.Safari/Webpage Previews/Incoming 2097152 183500800 /Users/hashi/Library/Caches/com.apple.Safari/

そこで(安易だが)長めのパターンでマッチさせる。
$ ps -A|grep "/Applications/Safari.app/Contents/MacOS" | grep -v grep|awk '{print $1}'
1487

良さそうだ。シェルスクリプトを作成して実験してみる。

ファイル名:restart_safari.sh
#!/bin/sh
ps -A|grep "/Applications/Safari.app/Contents/MacOS" | 
  grep -v grep|awk '{print $1}' | xargs kill
open -a Safari
※ps の箇所は実際は1行。

実行権限を付与しておく。
$ chmod +x restart_safari.sh

試しに実行するとうまく動いているようだ。
./restart_safari.sh



これを Xcode のビルドフェーズへ組み込む。

まず新規ビルドフェーズ「新規スクリプトを実行」を追加する。

情報を開き、先程のコマンドスクリプトを書き入れる。


これだけ。

ビルドするとコンパイル・リンクが終わった後、Safari が再起動された。