Cronでは、日付の表示形式にも注意が必要

2010.11.15.月
Server

大西です。

誰も更新してくれないので、まずは自分からと思い、更新です。
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
&#91;/text&#93;

<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も気をつけましょう!という、初心者みたいなネタでした。