(前回)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 が再起動された。