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

Cron定时任务日志文件在特定时间后停止写入问题求助

排查crontab运行的Python脚本停止输出日志问题

一、确认脚本是否真的在执行

  • 用strace跟踪Python进程(PID为19751),查看实时系统调用:
    strace -p 19751
    
    若有持续的系统调用(如read、select),说明脚本仍在运行;若长时间无输出,大概率陷入死循环或阻塞在某个操作上。
  • 检查进程文件描述符,确认stdout/stderr是否正常关联日志文件:
    ls -l /proc/19751/fd
    
    查看1(标准输出)和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
    
    若日志所在分区空间耗尽,会导致无法写入新内容。
  • 确认日志文件权限:
    ls -l /home/ubuntu/logs/process.log
    
    确保ubuntu用户拥有写入权限,异常时可重新设置:
    chown ubuntu:ubuntu /home/ubuntu/logs/process.log
    
  • 监控进程内存变化,排查内存泄漏:
    top -p 19751
    
    观察RES(常驻内存)是否持续增长,内存耗尽可能导致进程假死。

五、检查crontab环境差异

crontab默认环境变量比终端少,可能导致脚本依赖的路径或变量缺失:

  • 在crontab开头添加必要的环境变量,例如:
    PATH=/usr/local/bin:/usr/bin:/bin
    PYTHONPATH=/home/ubuntu/ib/op_script
    
  • 或在脚本开头显式设置所需环境变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:57:55