1. ホーム
  2. bash

[解決済み] スクリプトからのエラーメッセージを含むすべての端末出力をログファイルにパイプする方法

2022-02-15 18:29:17

質問事項

大規模なバックアップスクリプトのために、読みやすいログファイルを作ろうとしています。
スクリプト内では、コマンドからの出力をすべて大きなファイルにパイプするだけで、後でスクリプトによって "clean"することができるのです。たとえば、次のようなものです。

echo "Error occurred" >> log.file
mount disk >> log.file

私が見逃している警告とエラーは、スクリプトを実行するときにコンソールでパイプします。

backup.script >> log.file

しかし、それでもエラーメッセージがファイルに記録されるとは限らず、cronでスクリプト(パイプ付き)を実行すると、rsyncからのメールとスクリプトエラーが表示されます。

rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Broken pipe (32)
rsync: write failed on "/mnt/backup1/xxxxx": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(322) [receiver=3.0.9]
rsync: connection unexpectedly closed (215 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]

とスクリプトエラーが発生したときです。

/data/scripts/backup.auto: line 320: syntax error near unexpected token `else'

これらのエラーメッセージをログファイルに含めるにはどうすればよいですか?

解決方法は?

STDERR を STDOUT にリダイレクトするためには、以下のように 2>&1 各行の末尾に

echo "Error occurred" >> log.file 2>&1
mount disk >> log.file 2>&1

複数のファイルディスクリプタがある場合、それらをすべて標準出力にリダイレクトすればよい 3>&1...

編集部:ファイルディスクリプタの仕組みを覚えていないときは http://www.tldp.org/LDP/abs/html/io-redirection.html