インフラエンジニアbacchiのわかったことまとめ

bacchi.me

crontabでは「%」をエスケープしなければならない

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が動かないとかなり焦りますねー。

  • B!