crontabにおける%の罠

PlaggerがCPUをガンガン使ったまま終了しないので、原因究明のためにログをとることにした。Plaggerはcrontabから起動してるので、loglevelをdebugにして、標準出力をファイルにリダイレクトすることにした。一つのファイルにログを出力すると、後から探すのが大変だから、日時付きのファイル名にリダイレクトするようにcrontabを書いたら動作しなかった。

*/30 * * * * plagger >plagger_`date +%Y%m%d%H%M`.log`

これ、前にもはまったことがあるぞ、とcrontab(5)を確認すると、ビンゴ。

Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.

crontab(5)

crontabでは、%が改行として扱われるから、%そのものを使いたい場合は\でエスケープする必要がある。というわけで正しくは以下の通り記述する。

*/30 * * * * plagger >plagger_`date +\%Y\%m\%d\%H\%M`.log`

ちなみに、Plaggerはcnn.comのEFTを全力で処理してる状態だったので、cnn.comを巡回先から除外して様子見中。