2006年06月26日 21:54

マネッこしながらお勉強

マネッこするのはいいことなのか、はたまたいけないことなのか?チョット微妙なところですが、お勉強(スキルアップの題材)のためですのでどうぞお許し下さい。

メインのアプリケーションが起動すると、それに関連したアプリケーションを自動起動、メインアプリが終了すると、ヘルパーアプリも自動終了するというものです。

ヘルパーアプリケーション? を自動起動する ProcessSpy から2006年6月26日に引用

dark side of the moon」で配付されている「ProcessSpy」というソフトの説明です。これですね、會澤欲しかった機能なんですよ。特定のソフトが起動したときに自動的に別のソフトが起動する。メインのソフトが終了したときには、サブのソフトも自動終了する。そういう機能が欲しかったんです。具体的にはiTunesが起動したときに、NowPlayingが起動して欲しい。iTunesが終了したらNowPlayingも終了して欲しい。そういう機能です。

kaoru_ariさんのProcessSpyはアプリケーション形式です。これはこれで便利なわけですね。応用も利きます。ただ、會澤は現在のところiTunes:NowPlayingペア以外に使用するつもりはありません。會澤環境決め打ちで作ればよりシンプルなものになるだろうと思います。また、インターフェイスはなくともいいわけです。何せ決め打ちですから。iTunesとNowPlaying以外なんも必要としてないのです。ということでこれはシェルスクリプトで作ることでより、シンプルにできますよね。ということで、自身の勉強のために組んでみました。

機能は先に述べたとおりです。さて、分析してみましょう。

  1. 起動中のプロセスリストからiTunesを検索し、iTunesが起動中であれば次のステップに進む。起動してなければ一定期間後に再度検索を実行する(ここがループになりますね)。
  2. 更に起動中のリストからNowPlayingを検索し、NowPlayingが起動してなければ起動します。起動していれば1.に戻ります。

単純な構造ですね。さてこれをどう実現しましょうか。會澤が現在利用しているスクリプトを以下に表示します。

while true
do
  iTunesAlive=`ps -ax | grep "iTunes.app/Contents/MacOS/iTunes" | grep -v grep | wc -l`
  nowPlayingAlive=`ps -ax | grep "Now\ Playing.app" | grep -v grep | wc -l`
  if [ $iTunesAlive = 1 ]; then
    if [ $nowPlayingAlive = 0 ]; then
      open /Applications/NowPlaying/Now\ Playing.app
    fi
  else
    if [ $nowPlayingAlive = 1 ]; then
      kill `ps -ax | grep "Now\ Playing.app" | sed -e "s/\(^[ 0-9][ 0-9][ 0-9][ 0-9][0-9]\).*/\1/"`
    fi
  fi
  sleep 10
done

きっとモットうまい方法があるんだろうと思います。コマンド使い(私から見れば魔法使い)の方なら鼻で笑いそうなコードですよね。きっと。

キモは、iTunesAlive/nowPlayingAliveという二つの変数。バッククオートで囲まれた部分がシェルのプロセスとして実行され、結果が代入されます。iTunesAliveは単純にiTunes.appと指定できませんでした。パッケージの中のiTunes本体以外にも、ヘルパーアプリケーションが起動しているので一つに絞り込めなかったんですね。ヘルパーアプリケーションは常に起動しているようなのでこれも除外するためにgrepで指定しているのは多少増長になっています。二つの目のgrepはgrep自身を除外させるためのものです。そして最後に絞り込まれた行数を数えてその値を変数に代入します。理屈としてはnowPlayingAliveも同様ですね。

iTunesが起動しているならnowPlayingの起動状態を調べる必要がありますね。これは調べておいたiTunesAlive/nowPlayingAliveを参照して判断しています。OSXにはありがたいコマンドがあります。openというコマンドです。これは、通常Finderでアイコンをダブルクリックしたときのような動作を(デフォルトでは)してくれます。これがなかったらもっとめんどくさくなります。.appを起動するのもopenですし、urlを指定すればデフォルトのブラウザでそのアドレスを表示してくれます。テキストファイルだったら、これまたデフォルトのテキストエディターで開いてくれるんです。

さて、悩んだのは「iTunesが起動していなくて、NowPlayingが起動している場合」の処理です。會澤は乱暴にkillしてしまいましたが、NowPlayingの場合、自動的に画像を生成してアップロードするという動きをするアプリケーションですので、乱暴にkillしてしまっても問題ないと判断しました。加えて、NowPlayingのPIDを得る部分もきっともっと良い方法があるんだろうと思いますが、sedで強引に処理してます。

最後に常にループが回っていてもいたずらにCPUのリソースを食い尽くすことになりますのでウェイトを入れます。sleepですね。ここでは10秒を指定しています。10秒ごとに確認しているわけです。もっと長くてもいいかもしれませんね。

最後に全体をwhileループで囲みますが、条件は常に真となるようにして無限ループを作っています。

使い方は、こいつをシステム起動時に起動させるようにcronに登録してやります。


さて、少なくとも會澤の環境ではうまく動いてくれています。勝手に機能をパクってしまいました。kaoru_ariさんゴメンナサイ。もっと良い方法があったら教えてくださいな。nowPlayingAliveは最初のifの後で取得した方がいいですね。無駄なpsを発行しないようにした方がいいでしょうね。たぶん。

このエントリに頂いたコメント。この表示は随時更新されます。

by OKAMURA(2006-06-26T17:03:57-05:00)

結構いい線いっていると思いますよ。

そうですねえ、添削するとしたら次の事項でしょうか。


1. 関数を使う

プロセスの数を数える部分が複数箇所あります。そういうのは

function CntProcess() {

# ここに内容

}

というのを書いて

CntProcess "iTunes.app/Contents/MacOS/iTunes"

としてしまうとよいでしょう。


2. 数値の比較は -eq

if の条件部(test コマンド)では = は文字列の比較です。数値を比較しているのでここは -eq を使うのがよいでしょう。


3. ps コマンドのオプションに - を付けるのはレトロらしい

ps -ax は後方互換性のために使用可能で、今は ps ax でよいらしいです。というか ps は色々な系譜があるのでややっこしいっす。


それよりも會澤さんにプレゼントコマンドを作りました!

後でエントリにします。

by 會澤(2006-06-26T21:57:51-05:00)

1. なるほど、確かにそうですね。

2.そうなんですか?全然気がついていませんでした。

3.レトロですか...オプションには「-」は必須と思ってました。


わざわざ添削までしていただいて強縮です。

by kaoru_ari(2006-06-27T11:56:28-05:00)

會澤さんも私から見れば魔法使いの一員なので、アドバイス不能です(笑)

自分用のツールを作るのって楽しいですよね。

by 會澤(2006-06-27T12:18:00-05:00)

kaoru_ariさん

> 自分用のツールを作るのって楽しいですよね。


ウン(激しく同意)!

楽しいです。AppleScriptをパッケージングしてアプリケーションにするのはいつかやってみようと思っているのですがなかなかできない。どっかにいいテキストないかと思って探しています。

コメントを書き込むためには、下の「Comments」リンクをご利用下さい。
このエントリに頂いたコメント。この表示は随時更新されます。

by OKAMURA(2006-06-26T17:03:57-05:00)

結構いい線いっていると思いますよ。

そうですねえ、添削するとしたら次の事項でしょうか。


1. 関数を使う

プロセスの数を数える部分が複数箇所あります。そういうのは

function CntProcess() {

# ここに内容

}

というのを書いて

CntProcess "iTunes.app/Contents/MacOS/iTunes"

としてしまうとよいでしょう。


2. 数値の比較は -eq

if の条件部(test コマンド)では = は文字列の比較です。数値を比較しているのでここは -eq を使うのがよいでしょう。


3. ps コマンドのオプションに - を付けるのはレトロらしい

ps -ax は後方互換性のために使用可能で、今は ps ax でよいらしいです。というか ps は色々な系譜があるのでややっこしいっす。


それよりも會澤さんにプレゼントコマンドを作りました!

後でエントリにします。

by 會澤(2006-06-26T21:57:51-05:00)

1. なるほど、確かにそうですね。

2.そうなんですか?全然気がついていませんでした。

3.レトロですか...オプションには「-」は必須と思ってました。


わざわざ添削までしていただいて強縮です。

by kaoru_ari(2006-06-27T11:56:28-05:00)

會澤さんも私から見れば魔法使いの一員なので、アドバイス不能です(笑)

自分用のツールを作るのって楽しいですよね。

by 會澤(2006-06-27T12:18:00-05:00)

kaoru_ariさん

> 自分用のツールを作るのって楽しいですよね。


ウン(激しく同意)!

楽しいです。AppleScriptをパッケージングしてアプリケーションにするのはいつかやってみようと思っているのですがなかなかできない。どっかにいいテキストないかと思って探しています。

コメントを書き込むためには、下の「Comments」リンクをご利用下さい。

Posted by kaizawa | TrackBacks