次の行を含むcronを介して実行されるスクリプトがあります。
0 * * * * (/var/script.sh | tee -a /var/script.log)
stdout
正常出力とエラー出力の両方をキャプチャするには、cronエントリをどのように書き換える必要がありますかstderr
?それらは別のファイルに配置されます。
答え1
cron
ジョブは、Bourne、POSIX、または互換性sh
に関係なくデフォルトで実行され、構文は次のとおりです。sh
sh
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)csh
、zsh
または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
は次のとおりです。tee
MULT_IOS
SHELL=/bin/zsh
0 * * * * /var/script.sh >&1 2>&2 >>& /var/script.log
script.sh
これは、シャットダウン状態を保存し、script.sh
stderrを元のstderrに保つという利点もありますscript.log
(もちろん、stdoutとstderrが通常同じ場所に移動するcronジョブには大きな違いはありませんが)。
シェル(少なくともbash
)などの一部のBourne / POSIXには、パイプラインのすべてのコンポーネントでエラーを報告するために使用できるオプションがあります。ksh93
zsh
yash
mksh
pipefail
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
また、括弧を削除したことに注意してください。サブシェルでスクリプトを実行することは意味がありません。