大西です。
誰も更新してくれないので、まずは自分からと思い、更新です。
CRON用のシェルスクリプト書いてて、久しぶりにはまったので、紹介。
プログラムは非常に単純で、とあるディレクトリ以下にあるフォルダ一覧を取得して、その取得したフォルダ名を、とあるPHPプログラムの引数として渡して、ユーザの情報を解析するためのモノです。
詳細は、伏せますが、簡単に言うと、以下のプログラムになります。
#!/bin/bash USERLIST=/home/hoge/user.list ls -l /mnt/foo/bare | /usr/bin/awk '/^d/ {print $8}' > $USERLIST while read LINE do /usr/bin/php /home/hoge/php-script.php $LINE done < $USERLIST [/text] <span id="more-694"></span> 3行目で定義されたファイルに、4行目で、とあるディレクトリ以下のフォルダ一覧を取得しています。 これで、自分のユーザで実行すると、問題なく動作するのに、Crontabに設定して動かすと、なぜか$LINEに変な引数が渡されるようで、PHPのプログラムが途中でエラーになる。 まあ、後になってみれば、user.listファイルの中身を確認すればよかったとわかるのですが、それすら思いつかずさんざん悩んで、パスはあっているかとか、PHPが間違ってないかとか、色々とはまったあげくに、ようやくuser.listをみたのでした。 user.listをみると、本来はフォルダ名の一覧が入っているはずなのに、フォルダの時刻が入ってるではないですか・・・ そう、日時の表示形式が違っていたのでした。 <h4>ls -lをユーザで実行した場合</h4> [text gutter="false"] $ ls -l total 20 drwxr-xr-x 2 masateru kp 4096 2010-11-15 21:51 hoge1 drwxr-xr-x 2 masateru kp 4096 2010-11-15 21:51 hoge2 drwxr-xr-x 2 masateru kp 4096 2010-11-15 21:51 hoge3 drwxr-xr-x 2 masateru kp 4096 2010-11-15 21:51 hoge4 drwxr-xr-x 2 masateru kp 4096 2010-11-15 21:51 hoge5
ls -lをCrontabから実行した場合
$ ls -l total 20 drwxr-xr-x 2 masateru kp 4096 Nov 15 21:51 hoge1 drwxr-xr-x 2 masateru kp 4096 Nov 15 21:51 hoge2 drwxr-xr-x 2 masateru kp 4096 Nov 15 21:51 hoge3 drwxr-xr-x 2 masateru kp 4096 Nov 15 21:51 hoge4 drwxr-xr-x 2 masateru kp 4096 Nov 15 21:51 hoge5
スクリプトの方では、8個目の要素を取り出しているのですが、年-月-日というところが、月と日で分かれているため、8個目の要素が時間になっていたので、正しく動かないというどうしようもない落ちでした。
ということで、9個目の要素をとってくるようにすると、ユーザで実行した場合にまたややこしいことになりますので、スクリプトの方でLANGを指定して、同じ形になるようにんたいおうしました。
ということで、修正したプログラムは以下です。
#!/bin/bash
export LANG='ja_JP.UTF-8'
USERLIST=/home/hoge/user.list
ls -l /mnt/foo/bare | /usr/bin/awk '/^d/ {print $8}' > $USERLIST
while read LINE
do
/usr/bin/php /home/hoge/php-script.php $LINE
done < $USERLIST
[/text]
以上、CRON使うときは、LANGも気をつけましょう!という、初心者みたいなネタでした。