Req*_*ist 0 bash scripting error-reporting pipe
我正在尝试为大型备份文件创建可读的日志文件.
在脚本中,我只是将命令的所有输出传递给一个大文件,然后可以通过脚本"清理".例如:
echo "Error occurred" >> log.file
mount disk >> log.file
Run Code Online (Sandbox Code Playgroud)
在执行脚本时,我错过了警告和错误,我在控制台管道.
backup.script >> log.file
Run Code Online (Sandbox Code Playgroud)
但即便如此,当我通过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]
Run Code Online (Sandbox Code Playgroud)
并在发生脚本错误时:
/data/scripts/backup.auto: line 320: syntax error near unexpected token `else'
Run Code Online (Sandbox Code Playgroud)
如何在我的日志文件中包含这些错误消息?
要将STDERR重定向到STDOUT,必须2>&1在每行的末尾添加
echo "Error occurred" >> log.file 2>&1
mount disk >> log.file 2>&1
Run Code Online (Sandbox Code Playgroud)
如果你有多个文件描述符,只需将它们全部重定向到stdout 3>&1 ......
编辑:当我不记得文件描述符是如何工作的时候,我去http://www.tldp.org/LDP/abs/html/io-redirection.html