执行shell 脚本 如何将日志全部输出到文件

在执行 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)合并到标准输出(即也写入日志文件)。
  • 效果 :所有输出(包括 echomysqldump 正常信息、错误信息)都会写入日志文件。

方法 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. 推荐方法 1 或 2(简单可靠)。

  2. 日志轮转 :使用 logrotate 管理日志文件,避免日志过大:

    bash 复制代码
    # /etc/logrotate.d/mysql_backup
    /var/log/mysql_backup.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
    }
  3. 在 cron 中记录日志

    bash 复制代码
    0 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 集成到系统日志

选择最适合你的方式即可!

相关推荐
H_oRIZoN_2 小时前
Linux入门DAY41(51 单片机 串口与通信协议)
linux·运维·单片机
GeW3 小时前
RHCE备考别瞎学!按这个计划走,30天提高通过率,快速拿证
linux
Escalating_xu4 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊4 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
码农小韩4 小时前
Linux应用开发(六)——进程间通信
linux·linux驱动·嵌入式软件开发·嵌入式操作系统·linux应用
笨笨饿5 小时前
#138_解决Codex要五次回复的问题
linux·stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式实时数据库
m0_459872925 小时前
Linux 系统基础
linux·运维·服务器
吴声子夜歌5 小时前
Shell编程——数组
linux·运维·shell
blueSatchel6 小时前
ros-humble仿真-建图-导航
linux·ros2
Lucis__6 小时前
基于责任链模式的消息队列—异步处理流水线的最佳实践
linux·c++·消息队列·责任链模式·ipc