はじめに
とある日、Cronさんからお手紙(メール)をいただきました。
ちょっと前にcrontabで登録したコマンドがエラーになったようです。
/bin/sh: -c: 行 0: 一致する ``' を探索中に予期しないファイル終了 (EOF) です
/bin/sh: -c: 行 1: 構文エラー: 予期しないファイル終了 (EOF) です
何が起こったのか
こんなイメージのコマンドです。
0 0 * * * /usr/local/bin/hoge/poo.sh `date "+%Y%m"` >> /usr/local/bin/hoge/log/poo.log 2>&1
dateコマンドを使って当月(YYYYMM)を引数としてシェル(poo.sh)に渡すという至ってシンプルなもの。
手動で動作確認をしており、なぜエラーになったのかまったくわかりません。
グーグル先生に上記のエラーメッセージを丸投げするとすぐに教えてもらえました。
インターネットがなかった時代はどうやって調べていたんでしょうね。便利な時代になったものです。
自分でもman 5 crontab
で見てみました。
(抜粋)
A "%" character in the command, unless escaped with a backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.
要するに%(パーセント記号)は\(バックスラッシュ)でエスケープしないと、改行文字に置換され、%以降の文字列は標準入力としてコマンドに送られるということです。
修正する
0 0 * * * /usr/local/bin/hoge/poo.sh `date "+\%Y\%m"` >> /usr/local/bin/hoge/log/poo.log 2>&1
%(パーセント記号)の前に\(バックスラッシュ)を入れてエスケープします。
これで解決しました。
おわりに
要するに何かやるときはドキュメント読めよ、という事なのでしょうが、家電製品使う時も取説読まないからな。
何か起きないとドキュメント読まない。ダメですか?
ググっているときに見つけた副産物。
crontab -e は「絶対に」使ってはいけない
crontab -e
と打つつもりが crontab -r
と打ったらcronに登録したコマンドが全部消えちゃうよという事です。
たしかにEの横にはRがあり、危ない気がします。世間(?)では常識っぽいです。
それでも crontab -e
使うなぁ。cron消してしまったら海外逃亡しよう。