如何用tee记录自动重启bash脚本中Python程序的异常日志?
解决自动重启脚本日志无法记录异常的问题
我来帮你搞定这个头疼的日志记录问题!你遇到的情况大概率是因为没有正确捕获Python程序的标准错误输出(stderr),或者tee的重定向逻辑没写对,导致只有日期和提示信息进了日志,真正的异常丢了。
正确的脚本写法
直接给你调整好的脚本,每一步我都给你解释清楚:
#!/bin/bash # 定义日志文件路径 LOG_FILE="/var/log/app.log" # 无限循环实现自动重启 while true; do # 记录启动时间到日志(同时输出到终端) echo "[$(date '+%Y-%m-%d %H:%M:%S')] 正在启动 myapp.py..." | tee -a "$LOG_FILE" # 关键:把stderr重定向到stdout,让tee同时捕获正常输出和异常信息 # -u 参数让Python关闭输出缓冲,确保日志实时更新 python3 -u myapp.py 2>&1 | tee -a "$LOG_FILE" # 捕获程序退出码,方便排查问题 EXIT_CODE=$? echo "[$(date '+%Y-%m-%d %H:%M:%S')] myapp.py 退出,退出码: $EXIT_CODE。5秒后重启..." | tee -a "$LOG_FILE" sleep 5 done
关键细节说明
2>&1:这是核心!Linux里1代表标准输出(stdout),2代表标准错误(stderr)。这个命令把stderr的内容重定向到stdout,这样tee就能同时捕获程序的正常输出和崩溃时的异常堆栈信息。tee -a:-a是追加模式,避免每次重启脚本都清空之前的日志。如果不加-a,日志文件会被覆盖。python3 -u:Python默认会缓冲输出,导致异常信息可能不会立刻写入日志。-u参数关闭缓冲,让输出实时同步到日志里。
额外注意事项
- 权限问题:如果脚本运行时提示无法写入
/var/log/app.log,需要确保你的用户有该文件的写入权限。可以用以下命令调整:# 先创建日志文件(如果不存在) sudo touch /var/log/app.log # 把文件权限改成当前用户可写 sudo chown $(whoami):$(whoami) /var/log/app.log - 后台运行脚本:如果想让脚本在后台持续运行,可以用
nohup或者screen,比如:
这样即使终端关闭,脚本也会继续运行。nohup ./restart_script.sh &
这样修改后,你再看/var/log/app.log,就能看到myapp.py的所有输出(包括异常堆栈)和重启时间记录了!
内容的提问来源于stack exchange,提问作者user4851126
相关产品推荐
相关产品推荐

