回答:
crontabでは、スクリプトを実行するメールエイリアスを指すようにMAILTOを設定できます。このスクリプトは、メールメッセージを受け入れ、ヘッダーやその他のグープを取り除き、残りをロガーで記録します。すべてのcronスクリプト出力はMAILTOで指定されたアドレスに送信されるため、すべてをキャプチャします。
例:crontabで
MAILTO=myalias
/ etc / mail / aliases(sendmailを使用していると仮定)
myalias:"|/usr/local/bin/my-processing-script.sh"
スクリプトでメールヘッダーを削除し、cron出力を処理します。
コマンドによって生成された出力は、crontab(5)ファイルで設定されたMAILTO環境変数で指定されたユーザーに送信されます。MAILTO変数が設定されていない場合(またはこれがat(1)またはbatch(1)ジョブの場合) )、ジョブの所有者に。コマンドが出力を生成しない場合、またはMAILTO環境変数が空の文字列に設定されている場合、メールは送信されません。
ローカルメールを使用するため、実際には何も設定する必要はありません。または、まだここにない場合はmailxをインストールするだけです。Cronが出力を送信します。メールをファイルに保存し、そこから多くのことを行うことができます。cronの動作を変更して、ニーズに直接合わせることは、進むべき方法ではありません。そう思わない場合は、cronにパッチを適用して再ビルドし、my_cronと呼び、cronの代わりに使用します。最終的にmy_cronを最新の状態に保ち、頻繁に再構築する準備をします。
これをすべてのスクリプトの先頭に追加して、すべてをログに記録し、最初のエラーで停止します
exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e
> /var/log/YOUR_LOG_FILE 2>&1つまり、最初にstdoutをファイルにリダイレクトしてから、stderrをstdout(現在はファイルを指す)にリダイレクトします。
/programming//a/7145618/20774のRyan Yeのスクリプトは、これにも役立ちますが、stdoutとstderrの両方を実行します。
これを行う小さなスクリプトcronlog.shがあります。スクリプトコード
#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"
その後、あなたはできる
cronlog.sh /opt/scripts/sql_fetch >> your_log_file
結果例
cronlog.sh echo 'hello world!'
[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo