メール stderr 出力、cron に stderr+stdout 記録

メール stderr 出力、cron に stderr+stdout 記録

stdout + stderrを正しい順序でファイルに書き込みながら、cronはstderr出力のみをメールで送信したいと思います。

Tシャツはなんだかこれで遊んだのですが、何か少し合いません...

コマンドをシェルスクリプトでラップします。

良い

#!/bin/bash
mycommand | maybe_some_shell_redirect_magic >> /var/log/mycommand.log

答え1

私はこれが可能だと思います。行の順序を維持しながら(つまり、stderrはそれを作成するプロセス内でコピーされます)、POSIXシェルを使用しても同様です。努力する:

#!/bin/sh

exec 3>log
command args ... 2>&1 >&3 |while read err; do
  echo "$err" >&2
  echo "$err" >&3
done

答え2

stdoutとstderrを分離するときに順序を正確に保つことは不可能です。 stdoutとstderrの出力が時間的に近すぎない限り、合理的な結果を得ることができます。

mycommand 2>>/var/log/mycommand.log | tee -a /var/log/mycommand.log

テストにはmycommandの代わりにこのスクリプトを使用できます。

#!/bin/bash
echo stdout 1
sleep 0.1
echo stderr 1 >&2
sleep 0.1
echo stdout 2
sleep 0.1
echo stderr 2 >&2

sleepコマンドを削除すると、ログファイルの順序がやや混乱します。

関連情報