通过 Shell 包装脚本并捕获退出码($?)和执行时间,可轻量、可靠地记录 Python 脚本的启动时间、结束时间、成功/失败状态(0/1),无需额外 Python 监控模块或侵入式代码改造。
通过 shell 包装脚本并捕获退出码(`$?`)和执行时间,可轻量、可靠地记录 python 脚本的启动时间、结束时间、成功/失败状态(0/1),无需额外 python 监控模块或侵入式代码改造。
在自动化运维、定时任务(如 cron)或 CI/CD 流程中,准确判断 Python 脚本是否成功执行至关重要。最简洁、健壮且跨平台兼容的实践是使用 Bash 脚本封装 Python 执行过程,而非在 Python 内部复杂化日志逻辑或依赖第三方库。
✅ 推荐做法:Bash 封装 + 退出码检查
创建一个可复用的包装脚本(例如 run_with_monitor.sh):
#!/bin/bash
# run_with_monitor.sh
SCRIPT="$1"
if [ ! -f "$SCRIPT" ]; then
echo "Error: Script '$SCRIPT' not found."
exit 1
fi
echo "▶ Starting: $(date '+%Y-%m-%d %H:%M:%S')"
START_TIME=$(date +%s.%N)
# 执行目标脚本,并捕获真实退出码
python "$SCRIPT"
EXIT_CODE=$?
END_TIME=$(date +%s.%N)
ELAPSED=$(echo "$END_TIME - $START_TIME" | bc -l | awk '{printf "%.3f", $1}')
echo "◀ Finished: $(date '+%Y-%m-%d %H:%M:%S')"
echo "⏱ Duration: ${ELAPSED}s"
echo "✅ Success" && exit 0 || echo "❌ Failed (exit code: $EXIT_CODE)" && exit $EXIT_CODE
使用方式:
chmod +x run_with_monitor.sh ./run_with_monitor.sh myscript.py
? 关键原理说明
- $? 是上一条命令的真实退出状态码:Python 程序正常结束返回 0;遇到未捕获异常(如 raise ValueError)、调用 sys.exit(1) 或崩溃时,返回非零值(通常为 1)。这是 POSIX 标准,100% 可靠。
- date +%s.%N 提供毫秒级精度:比 time 命令更易解析,便于后续统计或写入日志。
- 无需修改原 Python 脚本:零侵入,兼容任意已有脚本(包括含 argparse、logging 或 try/except 的项目)。
⚠️ 注意事项
- 确保目标 .py 文件具有可执行权限(或显式调用 python script.py);
- 若脚本依赖虚拟环境,请在 Bash 中激活(如 source venv/bin/activate)或直接调用对应 Python 解释器路径(如 ~/venv/bin/python);
- 在 cron 中使用时,建议写绝对路径,并重定向输出:
0 2 * * * /home/user/run_with_monitor.sh /home/user/myscript.py >> /var/log/myscript.log 2>&1
? 总结
相比在 Python 中手动记录 start_time/end_time 并 try-catch 全局异常,Bash 封装方案更轻量、更健壮——它基于操作系统级进程生命周期,不受 Python 异常处理边界(如 os._exit()、信号终止、段错误)影响。对于绝大多数运维与调度场景,这是简单、标准且生产就绪的最佳实践。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











