2014/07/27

Automatorのシェルスクリプトは標準エラーの出力先を明示する

OS X 10.6(Snow Leopard)から10.9(Mavericks)に変えたところ、Automatorで作ったスクリプトが止まらなくなりました。

Firefoxで複数のプロファイルを使うためには、起動オプションにプロファイル名を指定して起動します。もちろん毎度手打ちするわけではなく、Windowsでは*.batファイルを作ったりしていましたが、MacではAutomatorというマクロ作成ツールを利用しています。

本来の処理イメージ

このAutomatorで実行できる処理の一つに「シェルスクリプトを実行」というのがあるのですが、10.9にしてから、シェルスクリプト内で起動したアプリ(Firefox)を終了するまで次のプロセスに行かなくなりました。

想定外の処理イメージ

結果、Firefoxを終了するまでAutomatorのプロセスが残り、メニューバーに回転する歯車アイコンが常駐し非常に目障りです。(実害はこれくらいですが)

/Applications/Firefox.app/Contents/MacOS/firefox-bin -no-remote -p "knyijong" & exit

元々使っていたスクリプトでもFirefoxの起動コマンドの後ろに"&"を付けているため、別プロセスで起動するはずです。

現に上記のコマンドをターミナルから実行した場合、Firefoxを終了しなくても処理がプロンプトに戻り、Firefoxより先にターミナルを終了しても問題ありません。

先ほどのメニューバーに表示される歯車をクリックして、終了させてもFirefoxはそのまま問題なく使用できます。

試しに、Automator右上にある「実行」ボタンからテスト実行すると、Firefoxを終了するまで「シェルスクリプトを実行」プロセスから先に進みません。

しかし、一度テスト実行中に「中止」ボタンで強制終了すると次回からの挙動が異なります。

「中止」した以降のテスト実行は、「実行」ボタンを押下した直後にプロセスを終了し次に進みます。実際にはFirefoxの起動に数秒かかるため、Firefoxのウィンドウが視認できるより先にAutomatorのプロセスは終了します。

しかし、Automatorの変更内容を上書き保存し、再度テスト実行すると最初の状態にもどり、Firefoxの終了を待ち、プロセスが終了しなくなります。

つまり、なにがしかの条件が整えば想定通りに動いてくれる可能性があるということです。

似たような事案が無いか調べたところ、標準エラー出力をリダイレクトするとプロセスが進むという話が見つかりました。

試しに、先ほどのスクリプトを以下のように修正しました。標準エラー出力の内容自体は要らないので、nullに放り込んでいます。

/Applications/Firefox.app/Contents/MacOS/firefox-bin -no-remote -p "knyijong" >& /dev/null/ &

すると確かにテスト実行でもFirefoxの終了を待たずにプロセスが終了し、*.appとして保存したマクロから実行しても歯車アイコンがメニューバーに残らなくなりました。

「中止」ボタンによる強制終了を行うと、Automatorのツール側でエラー処理などを行った結果、標準エラー出力が開くのでしょうか。バグなのか仕様なのかは不明ですが、現状これで問題は起きていません。

また、余談ですが、最後に記述していた"exit"は無くても終了しました。これは元から余分だったのかどうか今となっては不明です。