次のcronジョブを定義しました。
55 8 * * 3 /usr/bin/php /home/mark/dev/processes/customClient/events.php > /home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv
0 9 * * 3 /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s 'Events from `date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`' -a '/home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv'
上記のコマンドをコマンドラインから直接実行すると正常に動作するようです。ところで今朝スクリプト実行を確認してみると、次のティックが正しく閉じられないという内容のメール(誤って削除して依頼したものです)をいただきました。
答え1
cron 作業コマンドが対話型シェルに直接コマンドを入力するのとは異なる動作をする 3 つの一般的な理由は次のとおりです。
- Cronは限られた環境、つまり最小限を提供し、
$PATH
他の予想変数が不足しています。 - Cronはデフォルトで呼び出されますが、
/bin/sh
他のシェルを対話的に使用することもできます。 - Cronは
%
この文字を特別に処理します(コマンドから改行文字に変換)。 - Cronは端末やグラフィック環境を提供しません。
crontabファイルでは、%
すべての文字の前に付ける必要があります\
。これは、cronにコマンドにパーセントのみを入力するように指示します。date
クローン操作でこのコマンドを使用するときは、この点に注意してください。
55 8 * * 3 /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0 9 * * 3 /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
また、いくつかの引用問題も解決しました。
- 読みやすさとは別に問題は発生しませんが、コマンドの置き換えにバックティックを使用しないでください。代替の使用
$(…)
: 構文解析ルールはより簡単です。 - 変数とコマンドの置換には常に二重引用符を使用してください
"$somevariable"
。"$(somecommand)"
ここでは、date
コマンドが使用している型の特殊文字を返さないため、引用符がなくても問題はありません。ただし、どの文字が特殊であるかを注意深く覚えており、引用符がないすべての代替項目でこれを確認する必要があります。結果のフィールド分割とファイル名の生成を望まない限り、単純に保ち、常に二重引用符を使用してください。 - 特定のコマンド置換への拡張を防ぐ一重引用符があります。代わりに二重引用符を使用してください。
答え2
いくつかの理由で、重要なcronジョブを独自のシェルスクリプトファイルに入れることをお勧めします。
- より簡単なデバッグ:長い行をコピーして貼り付けるのではなく、スクリプトを実行すると、正しいshebang行を使用すると、crontabで直接同じコマンドを使用するよりも予測可能に動作します。
- 読みやすさ:200文字以上の1行にするのではなく、誰でも簡単に読みやすく理解できるようにフォーマットを素敵に指定できます。
- バージョン管理にスクリプトを追加する
答え3
'
次のコマンドをネストしているようですmutt
。
「事件の源は
date +%Y-%m-%d --date='last Wednesday'
――」date +%Y-%m-%d
文が読み取られるように"
内部の代わりに使用してみてください。'
「事件の源は
date +%Y-%m-%d --date="last Wednesday"
――」date +%Y-%m-%d