2006年07月31日 06:25
なんか変だと思ったらcronがパスを認識しない
先日来、
(^^)v3: iTunes List lastest 50 songs から2006年7月30日に引用このエントリは自動更新型エントリです。AppleScriptとシェルスクリプト。それにNanoBloggerを組み合わせて會澤がラジオがわりに聞いているiTunesの再生曲目をリストアップしております。原則として平日の朝に更新作業が行われるようにセットしてあります。興味がありましたらときどきのぞいてやってください。
などと言っていたにもかかわらず、このエントリが更新されていなかったんですね。ターミナルを立ち上げる度エラーが出ているのが報告されています。わかってはいたのですが、原因がわかりません。
早朝に手動で更新したりしましたが、対処療法すら見あたらないのです。以前は問題なかったはず。そもそも、シェルスクリプトでこれら機能を実現しており、別段たいしたコマンドを使っているわけではないのです。 cat / cd / cp / find / grep / mv / open / rm / sed / tar 等々、ごく一般的なものばかりです。ところが、おかしなエラーが出始めているんです。気がついたのは cp コマンドが出力しているエラーでした。
cp: illegal option -- a
つまり、 cp がaオプションを認識していないのです。ところが、ターミナルから手打ちで cp にaオプションを指定してやるとちゃんと実行する。なぜ?
さて、ここでふと思いついて which cp とタイプしてみました。答は「/sw/bin/cp」です。あれ?こんなところに cp ってあるんだっけ?「/bin/cp」あたりだと思ってたんですけど...ということで「/bin/」を見てみると cp は存在する。どうも両者のバージョンが異なるよう。
記憶の彼方で fink を使って、多くのコマンドをインストールしたことがあるように思うので、その時に「/sw/bin/cp」がインストールされたのではないかと思います。それはいい。紛らわしいけど2つの cp が存在し、片方がaオプションを理解していない。そこまではいい(あまりよくはないけど)。
ターミナルから手打ちでスクリプトを実行させるときには、「/sw/bin/cp」が動き、cronから同じスクリプトを実行させようとすると、「/bin/cp」が動くッちゅうのはなんでなんでしょう。環境変数の「PATH」にはちゃんと「/sw/bin」が先頭にあります。ウ〜ン。なんか勘違いしてるみたいだなぁ。
Manpage of CRONTAB から2006年7月31日に引用(アンダーラインは會澤)いくつかの環境変数は cron(8) デーモンによって自動的に設定される。 SHELL は /bin/sh に設定され、 LOGNAME と HOME は /etc/passwd の crontab の所有者の行から設定される。 HOME と SHELL は crontab 内部の記述で変更できる。
調べてたら、上記記述があった。なんか実をいうとよくわかってないのだけど、 SHELL が変わってしまう。ってのが引っかかる。これを通常の/bin/bash にしてやればいいのかなぁ。以前は動いていたように思うんだけどなぁ。気のせいだったかなぁ。
パスを理解していないらしいと言うことがわかったので、 cp もフルパスで記述して動くようになった。ただ、「Manpage of CRONTAB」の記述を見る限り cron はターミナル上から手打ちしたり、スクリプトを指定したりしているのとは異なる環境下で実行される(?)らしいですよね。それが原因かな。もう少し勉強してみます。
Posted by kaizawa | TrackBacks