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コマンドを削除すると、ログファイルの順序がやや混乱します。