crontabで引数を指定する方法。

スポンサーリンク

crontabを使って1つのスクリプトに色々な引数を与えて自動起動してウマー、といこうと思ったのですが、意外なところで引っかかりました。

元々は、

*/5 * * * *  /test/script.php type-a
*/8 * * * *  /test/script.php type-b

というもので、type-aとtype-bの挙動をさせようと思ったのですが、これが全く動きません。

script.phpの中では当然、

if ($argv[1]) $type = $argv[1] ;

みたいな事を書いてあるんですが・・・

で、色々調べて見たけどそれっぽいのは無し。シェルに環境変数を渡して、それをスクリプト側で取り込む・・・とか、遠回りっぽいのばかり。
結局試行錯誤して・・・出来ました。
バッククォートで括ると動きます。

スポンサーリンク
*/5 * * * *  `/test/script.php type-a`
*/8 * * * *  `/test/script.php type-b`

これが出来ると色々楽です。

<追記>

んー、これ確かに動くんですが、スクリプトからエラーやNoticeが吐かれるとそれもシェルに渡しちゃいますね・・・。
バッチスクリプトなんかは吐いたエラーをcronとしてメールで送ってくれるので、それをチェックしている方もいると思いますが、
上の方法だと、”Command not found”ばっかりになるのと、万が一なんか変なのが吐かれると・・・と思うと怖いです。

という事であきらめて、こういう風にしてみました。

~/test/script.php

これを前提にすると、格納しているディレクトリに渡したい引数のシンボリックリンクを貼ります。

ln -s test test2

これで

~/test/script.php
~/test2/script.php

という実体が同じでパスが違う2つのスクリプトがあることになるので、このscript.phpの中で、

chdir($_SERVER['PWD']) ;
$foo = 'test' ;
if (basename($_SERVER['PWD']) != basename(__DIR__)) $foo = basename($_SERVER['PWD']) ;

としました。__DIR__はシンボリックリンクを展開するので、違うならシンボリックリンクの名前を引数に取る、という仕組み。
これなら、

*/5 * * * *  ~/test/script.php
*/8 * * * *  ~/test2/script.php

と書けて、実体は同じ、というメンテナンス性も確保できるかな、と。
スクリプトが絶対エラーをはかないなら上のバッククォートでもOKです。

スポンサーリンク