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の設定をコピペして実行すると、これもまたおかしなことになる。
コメント