標準(stdout)出力とエラー(stderr)出力のキャプチャ

標準(stdout)出力とエラー(stderr)出力のキャプチャ

次の行を含むcronを介して実行されるスクリプトがあります。

0 * * * * (/var/script.sh | tee -a /var/script.log)

stdout正常出力とエラー出力の両方をキャプチャするには、cronエントリをどのように書き換える必要がありますかstderr?それらは別のファイルに配置されます。

答え1

cronジョブは、Bourne、POSIX、または互換性shに関係なくデフォルトで実行され、構文は次のとおりです。shsh

0 * * * * /var/script.sh 2>&1 | tee -a /var/script.log

これにより、|両側の2つのコマンドがパイプ接続と並列に実行されます。左側のコマンドの stdout(fd 1) はパイプの書き込み端に挿入され、右側のコマンドの stdin(fd 0) はパイプの書き込み端に挿入されます。読み終わったら、パイプを使用してください。

2>&1左側に追加して、fd 2(stderr)がfd 1が指すのと同じリソース、つまりパイプの書き込みの終わりを指すようにします。したがって、通常出力とエラー出力の両方がscript.shパイプに移動しますtee

tee標準出力(クローンジョブの場合は、ユーザーに電子メールを送信するために使用されるパイプまたは一時ファイル)とscript.log

この構文はfishシェルでも機能します。

(t)cshzshまたはbash(バージョン4.0以降)を使用して、次のこともできます。

SHELL=/bin/zsh # or tcsh, bash ...
0 * * * * /var/script.sh |& tee -a /var/script.log

(コマンドラインを解釈するために別のシェルを使用するSHELL=/bin/zsh方法を教えてください)。cron

では代わりにfish使用できます。&||&

rc(の後続sh)または派生語の場合、構文は次のとおりです。

SHELL=/bin/rc # or es, akanga
0 * * * * /var/script.sh >[2=1] | tee -a /var/script.log

機能のおかげで使用するかどうかzshは次のとおりです。teeMULT_IOS

SHELL=/bin/zsh
0 * * * * /var/script.sh >&1 2>&2 >>& /var/script.log

script.shこれは、シャットダウン状態を保存し、script.shstderrを元のstderrに保つという利点もありますscript.log(もちろん、stdoutとstderrが通常同じ場所に移動するcronジョブには大きな違いはありませんが)。

シェル(少なくともbash)などの一部のBourne / POSIXには、パイプラインのすべてのコンポーネントでエラーを報告するために使用できるオプションがあります。ksh93zshyashmkshpipefail

SHELL=/bin/ksh # or zsh, bash...
0 * * * * set -o pipefail && /var/script.sh 2>&1 | tee -a /var/script.log

答え2

cronは、出力を生成したすべてのcronジョブについて知りたいです。結果を電子メールで送信しようとしています。 cronから電子メールを受信したくない場合は、ジョブが出力を生成しないことを確認してください。を使用せずに出力teeをリダイレクトしてください。

0 * * * * /var/script.sh >> /var/script.log 2>&1

また、括弧を削除したことに注意してください。サブシェルでスクリプトを実行することは意味がありません。

関連情報