crontabのすべてのstderr出力をファイルに記録する


12

たとえばstderr、次の方法で1つのスクリプトのログを記録できます。

* * * * * run_script.sh > /var/log.txt 2>&1

しかしstderr、crontabのすべてのスクリプトをログに記録したいと思います。> /var/log.txt 2>&1すべてのスクリプトに追加できますが、に何百ものスクリプトがある場合は良くありませんcron。これを行う別のより簡単な方法はありますか?

回答:


6

crontabでは、スクリプトを実行するメールエイリアスを指すようにMAILTOを設定できます。このスクリプトは、メールメッセージを受け入れ、ヘッダーやその他のグープを取り除き、残りをロガーで記録します。すべてのcronスクリプト出力はMAILTOで指定されたアドレスに送信されるため、すべてをキャプチャします。

例:crontabで

MAILTO=myalias

/ etc / mail / aliases(sendmailを使用していると仮定)

myalias:"|/usr/local/bin/my-processing-script.sh"

スクリプトでメールヘッダーを削除し、cron出力を処理します。


MAILTO、エイリアス、MTA、スクリプトなどの設定について具体的に説明できますか?
エンドリス

1
@endolith私は答えを編集して、sendmailと広く互換性のあるMTAで動作するはずの基本的なセットアップを提供しました。自分でスクリプトを作成する必要があります。
カイルジョーンズ

5

コマンドによって生成された出力は、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(現在はファイルを指す)にリダイレクトします。
jfs

Cronによって生成されたエラーを読み取るために、メールサービス(および場合によってはメールクライアント)をインストールする必要がある最小限のサーバーに非常に夢中です。それはアナキスティックなデザインの決定のように感じます。
ジェームズマクマホン

0

/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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.