web-dev-qa-db-ja.com

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

たとえば、次のように1つのスクリプトのstderrを記録できます。

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

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

12
Maslov Anton

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

例:crontab内

MAILTO=myalias

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

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

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

6
Kyle Jones

コマンドによって生成された出力は、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
5
Aki

https://stackoverflow.com/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
0
James McMahon