crontabで%(パーセント記号)を使うときは\でエスケープする


2010年 11月 17日

cronはUNIX系システムでタスクの定時実行を行うためのツールです。どのUNIX系システムでもまず間違いなく入っているので、システム開発の際でもよく使いますが、古いUNIX由来のツールにありがちなバッドノウハウに嵌ったのでご紹介します。

crontabのコマンドを指定するところで%(パーセント記号)を使うときは\でエスケープする

日付つきのファイル名でログを保存しておきたくなることや、コマンドライン引数中に%を使いたくなることがたまにあります。dateコマンドを使う場合には、次のように書きたくなるわけですが、これはうまく解釈されません。

0 0 * * * wonderful_command > log_of_date +%Y%m%d.txt

(そうです、あのウザいメッセージがプロンプトの上に延々と表示されることになります! You have new mail. You have new mail. You have new mail. You have new mail. You have new mail. You have new mail. …)

crontabのコマンドを指定するフィールドで%を使うと、最初の%以降は標準入力に対する入力して解釈されます。%そのものを使いたい場合には(バックスラッシュ記号)でエスケープする必要があります。

上の例はこんな風に直せば、期待通りに日付つきファイル名でログが保存されることになります。

0 0 * * * wonderful_command > log_of_date +\%Y\%m\%d.txt

これがどこかの仕様として決まっている動作なのかは調べることができませんでした。現在一般的なcronの実装であるvixie cron のmanには次のように書かれています。

The “sixth” field (the rest of the line) specifies the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the crontab file. 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. There is no way to split a single command line onto multiple lines, like the shell’s trailing “\\”.

(フォントの都合で円マークとバックスラッシュが混じって表示されているかもしれませんが、同じ文字を意味しています)