Cron定时任务日志文件在特定时间后停止写入问题求助
排查crontab运行的Python脚本停止输出日志问题
一、确认脚本是否真的在执行
- 用
strace跟踪Python进程(PID为19751),查看实时系统调用:
若有持续的系统调用(如strace -p 19751read、select),说明脚本仍在运行;若长时间无输出,大概率陷入死循环或阻塞在某个操作上。 - 检查进程文件描述符,确认stdout/stderr是否正常关联日志文件:
查看ls -l /proc/19751/fd1(标准输出)和2(标准错误)是否指向/home/ubuntu/logs/process.log,若显示closed则说明输出流被意外关闭。
二、解决Python输出缓冲问题
Python将输出重定向到文件时,默认启用块缓冲,导致print内容不会立即写入日志,看起来像停止输出。可通过以下方式解决:
- 运行脚本时加
-u参数强制无缓冲,修改crontab命令为:python3 -u /home/ubuntu/ib/op_script/process.py > /home/ubuntu/logs/process.log 2>&1 - 在脚本的print语句中添加
flush=True:print("日志内容", flush=True) - 或在脚本开头设置全局行缓冲:
import sys sys.stdout = open(sys.stdout.fileno(), 'w', buffering=1)
三、排查脚本逻辑阻塞
脚本基于while循环,可能卡在某个业务环节:
- 检查循环内是否有等待外部资源的操作(如网络请求、文件锁、数据库连接)且未设置超时,可在这些操作前后添加日志记录进入/退出时间。
- 替换print为
logging模块,输出更详细的上下文信息(如循环次数、当前处理任务):import logging logging.basicConfig(filename='/home/ubuntu/logs/process_detail.log', level=logging.INFO, format='%(asctime)s - %(message)s') while True: logging.info("进入第X次循环") # 业务逻辑代码 logging.info("完成本次循环")
四、检查系统与权限问题
- 检查磁盘空间是否已满:
若日志所在分区空间耗尽,会导致无法写入新内容。df -h - 确认日志文件权限:
确保ubuntu用户拥有写入权限,异常时可重新设置:ls -l /home/ubuntu/logs/process.logchown ubuntu:ubuntu /home/ubuntu/logs/process.log - 监控进程内存变化,排查内存泄漏:
观察RES(常驻内存)是否持续增长,内存耗尽可能导致进程假死。top -p 19751
五、检查crontab环境差异
crontab默认环境变量比终端少,可能导致脚本依赖的路径或变量缺失:
- 在crontab开头添加必要的环境变量,例如:
PATH=/usr/local/bin:/usr/bin:/bin PYTHONPATH=/home/ubuntu/ib/op_script - 或在脚本开头显式设置所需环境变量。
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

