crontabの%利用によるエラー
crontabを使ったルーティン処理は、まず間違いなく利用すると思います。
そのcrontabの処理結果をメールで受け取る人もいるかと思いますが、そのエラーの内容を無視する人もいますね。
みない(もしくは処理していない)ならメールを受ける意味がないのでは・・・と思いますが、そんな無視された処理をたまたま発見したので記載しておきます。
エラー内容
/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
お知らせいただいたのは、上記のような内容。
バッククォートの対が見つからないというエラーでしょう。
ソースコード
実際のコードを見ると以下のようになっていました。
特定の時刻に年月日のファイルを生成している感じですね。
上記エラーは「バッククォートの対が見つからない」のようなものでした。
知っている人は気付きますが、「バッククォートあたりが怪しい」ことが判断できそうです。
10 8 * * * ●●●●● > /sample/bk_`date +%Y%m%d`.log
crontab の コマンドフォーマット
crontabのmanpageを確認すると以下のように記載されています。
%はコマンド終了と解釈されて、それ以降は標準入力として処理されるということですね。
The “sixth” field (the rest of the line) specifies the command to be run.
The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile.
Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.「第6」フィールド (行の残りの部分) には実行されるコマンドを指定する。
https://www.computerhope.com/unix/ucrontab.htm
その行のコマンド部 (改行文字または % 文字まで) が /bin/sh (またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって実行される。
コマンド中にパーセント記号 (%) が バックスラッシュ (\) によってエスケープされずに置かれていると、 改行文字に置き換えられ、最初に現れた % 以降の全てのデータは 標準入力としてコマンドに送られる。
crontabのエスケープ
上記のことから、今回のエラーを解決する方法は以下の2種類。
- crontabでコマンドラインを呼び出す場合、%はエスケープする
- 処理を別のスクリプトにして、crontabから呼び出す