inexio(アイネクシオ)

私たちはネットワークから新しいアイデアを創出します

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」フィールド (行の残りの部分) には実行されるコマンドを指定する。
その行のコマンド部 (改行文字または % 文字まで) が /bin/sh (またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって実行される。
コマンド中にパーセント記号 (%) が バックスラッシュ (\) によってエスケープされずに置かれていると、 改行文字に置き換えられ、最初に現れた % 以降の全てのデータは 標準入力としてコマンドに送られる。

crontabのエスケープ

上記のことから、今回のエラーを解決する方法は以下の2種類。

  • crontabでコマンドラインを呼び出す場合、%はエスケープする
  • 処理を別のスクリプトにして、crontabから呼び出す

 - Webサービス, 開発環境 , ,