SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

crontabの設定で変数に日付を代入しようとしたらうまく動かない

問題

cronで変数を使いたいのですがうまくいきません。

具体的には、ファイル名に日付をつけようとして以下のようにしたのですが、思ったように実行されないです。

答え

cronのコマンド部分では、%をエスケープする必要がある。

cron デーモンは、6 番目のフィールドに指定されたコマンドを、選択された日時に実行します。6 番目のフィールドに % (パーセント記号) を指定した場合、この % 記号をエスケープ (¥%) しない限り、cron デーモンは % 記号の前のすべてのデータをコマンド呼び出しとして処理し、% 記号のあとのすべてのデータを標準入力に使用できるようにします。ブランク行、および行の最初のブランク以外の文字が番号記号 (#) である行は、無視さ れます。 コマンドに与えられる引数にバックスラッシュ (¥) がある場合、そのバックスラッシュの前にもう 1 つバックスラッシュがなければなりません。

以下は期待したように動作しない。

0 12 * * * filename=/root/df-`date '+%Y%m%d'` ; date "+%Y-%m-%d %H:%M:%S" >> $filename

/var/log/cron を確認すると、最初の%の前まででコマンドが切れているのが確認できる。

変数を使用するのが問題なのではなくて、dateコマンドのフォーマット指定の部分が問題。

以下のように修正する必要がある(% をエスケープして \% にする)。

0 12 * * * filename=/root/df-`date '+\%Y\%m\%d'` ; date "+\%Y-\%m-\%d \%H:\%M:\%S" >> $filename

通常のコマンドラインでの実行や、シェルスクリプトに書くときは、%をエスケープしなくてよいので、%がエスケープされたcronの設定をコピペして実行すると、これもまたおかしなことになる。

関連するメモ

コメント