crontabでは「%」をエスケープしなければならない
タイトルそのまんまですが、少し悩まされたのでメモ。
crontabに以下のようなタスクを仕込み、実行してみたところ失敗してしまいました。
45 * * * * scp -P 20022 -i /root/.ssh/gealach_rsa /home/mysql/backup/hourly.`date +%H`.tgz gealach:/root/mysql/backup
手動で実行すると期待通りの動作をする。
/var/log/cronを見てみると、以下のようなログが吐かれていました。
Nov 2 21:45:01 kotori CROND[2565]: (root) CMD (scp -P 20022 -i /root/.ssh/gealach_rsa /home/mysql/backup/hourly.`date +)
コマンドの実行が中途半端なところで止まっている・・
以下のコマンドを実行し、manでcrontabのファイルフォーマットの説明を見てみた。
# man 5 crontab
「第 6」フィールド (行の残りの部分) には実行されるコマンドを指定する。 その行のコマンド部 (改行文字または % 文字まで) が /bin/sh (またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって実行される。
コマンド中にパーセント記号 (%) が バックスラッシュ () によってエスケープされずに置かれていると、改行文字に置き換えられ、最初に現れた % 以降の全てのデータは 標準入力としてコマンドに送られる。
シェルの行末の "" のような、 コマンドの単一の行を複数行に分割して記述する方法は、crontab にはない。
%はコマンドの終端として処理されるようです。
%をバックスラッシュ「」でエスケープすれば%以降のデータは標準入力としてコマンドに送られるとのことなので、そのとおりにやってみたらOKでした。
Nov 2 22:55:01 kotori CROND[4721]: (root) CMD (/bin/cp /home/mysql/backup/hourly.`date +%H`.tgz /home/bacchi/Dropbox/backup/document/)
自信満々で仕込んだcronが動かないとかなり焦りますねー。