在执行 Shell 脚本时,如果需要将 所有输出(包括标准输出 stdout
和错误输出 stderr
) 重定向到日志文件,可以使用以下方法:
方法 1:直接重定向(推荐)
bash
/appdata/mysql_backup_dump.sh > /var/log/mysql_backup.log 2>&1
>
:将标准输出(stdout
)重定向到/var/log/mysql_backup.log
。2>&1
:将错误输出(stderr
)合并到标准输出(即也写入日志文件)。- 效果 :所有输出(包括
echo
、mysqldump
正常信息、错误信息)都会写入日志文件。
方法 2:追加模式(不覆盖旧日志)
bash
/appdata/mysql_backup_dump.sh >> /var/log/mysql_backup.log 2>&1
>>
:追加到日志文件(而不是覆盖),适合长期运行的备份任务。
方法 3:使用 tee
命令(同时输出到屏幕和文件)
bash
/appdata/mysql_backup_dump.sh 2>&1 | tee -a /var/log/mysql_backup.log
tee -a
:将输出 同时显示在终端 并 追加到日志文件 (-a
表示追加)。- 适用场景:调试时想实时查看输出,同时保留日志。
方法 4:在脚本内部重定向
如果脚本是自己编写的,可以在脚本开头指定日志文件:
bash
#!/bin/bash
exec > /var/log/mysql_backup.log 2>&1 # 所有后续输出都重定向到日志
echo "Backup started at $(date)"
# 备份命令(如 mysqldump)
exec
:重定向整个脚本的输出,包括后续所有命令。
方法 5:使用 logger
写入系统日志
如果希望日志进入系统日志(如 /var/log/syslog
或 /var/log/messages
):
bash
/appdata/mysql_backup_dump.sh > /tmp/backup.log 2>&1
logger -t "MySQL_BACKUP" -f /tmp/backup.log # 写入系统日志
rm -f /tmp/backup.log # 可选:删除临时日志文件
logger -t "TAG"
:给日志添加标签(方便过滤)。-f
:指定日志文件路径。
最佳实践
-
推荐方法 1 或 2(简单可靠)。
-
日志轮转 :使用
logrotate
管理日志文件,避免日志过大:bash# /etc/logrotate.d/mysql_backup /var/log/mysql_backup.log { daily rotate 7 compress missingok notifempty }
-
在 cron 中记录日志 :
bash0 2 * * * /appdata/mysql_backup_dump.sh > /var/log/mysql_backup.log 2>&1
验证日志是否生效
bash
tail -f /var/log/mysql_backup.log # 实时查看日志
或手动运行脚本并检查日志:
bash
/appdata/mysql_backup_dump.sh > /var/log/mysql_backup.log 2>&1
cat /var/log/mysql_backup.log
总结
方法 | 命令 | 特点 |
---|---|---|
覆盖日志 | > log 2>&1 |
每次运行覆盖旧日志 |
追加日志 | >> log 2>&1 |
保留历史日志 |
屏幕+文件 | `2>&1 | tee -a log` |
脚本内重定向 | exec > log 2>&1 |
整个脚本生效 |
系统日志 | logger -t TAG -f log |
集成到系统日志 |
选择最适合你的方式即可!