stderrがファイルに追加される方法のカスタマイズ

stderrがファイルに追加される方法のカスタマイズ

rsyncを使用して2つのディレクトリを同期するシェルスクリプトに関する質問があります。 rsyncコマンドの結果(成功の有無にかかわらず)をstatusというファイルに保存し、問題が発生するとstderr出力がerrorというファイルに追加されます。ただし、エラーファイルに実際のエラーより前のタイムスタンプを入力する方法が見つからないようです。

最後に、次のようなものが必要です。

if rsync source destination 2>> error # but I need to have the date before the actual error is appended!
then
   echo "`date` - Success" >> status
else
   echo "`date` - Failure" >> status
fi

また、以下を試しました。

(rsync source destination && echo "`date` - Success" >> status || echo "`date` - Failure" >> status) 2>>error

これを行う唯一の方法は、stderr出力を一時ファイルに保存し、タイムスタンプが入力された後に内容がエラーファイルに追加されるようにすることです。

答え1

これを試してみましたか?

rsync -av blah blah 2>&1|perl -e "while(<>){s/^/`date`  /g; print;}" >>logfile

行の先頭に日付とスペースが追加されます。

答え2

この質問をしてから3ヶ月を超えたことがわかりましたが、結局私がしたことをシェルスクリプトで見せてほしいと思いました。

説明したように、タイムスタンプの追加など、ログファイルで操作できるようにstderrを何らかの方法でキャプチャする必要があります。ファイルを使用し、Patrickの提案に従ってこれを行うことができますが、できるだけ簡単にしたいと思います。

だからこれは私の解決策です。

if ! result=$(command_that_will_produce_errors 2>&1 1>/dev/null)
then
    echo "There was an error on $(date): $result" >> logfile
else
    echo "Command executed successfully on $(date)" >> logfile
fi

答え3

GregのWikiにアイテムがあります。ストリームの各行にタイムスタンプを追加します。これには、環境に応じてさまざまな方法が含まれます。それらはすべてループ/プロセスを介してストリームをパイピングし、POSIX互換バージョンを追加することでまとめられています。

while IFS= read -r line; do
    echo "$(date +%Y%m%d-%H:%M:%S) $line"
done

関連情報