You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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参数关闭缓冲,让输出实时同步到日志里。

额外注意事项

  1. 权限问题:如果脚本运行时提示无法写入/var/log/app.log,需要确保你的用户有该文件的写入权限。可以用以下命令调整:
    # 先创建日志文件(如果不存在)
    sudo touch /var/log/app.log
    # 把文件权限改成当前用户可写
    sudo chown $(whoami):$(whoami) /var/log/app.log
    
  2. 后台运行脚本:如果想让脚本在后台持续运行,可以用nohup或者screen,比如:
    nohup ./restart_script.sh &
    
    这样即使终端关闭,脚本也会继续运行。

这样修改后,你再看/var/log/app.log,就能看到myapp.py的所有输出(包括异常堆栈)和重启时间记录了!

内容的提问来源于stack exchange,提问作者user4851126

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:33:46