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