【修复】centos定时任务python top不能输出

问题

用python监控进程占用硬件资源时,手动执行正常运行,定时任务执行出错

在centos的定时任务中,用python的os模块执行top命令时终端没有输出

python 复制代码
cmd = 'top -d 1 -n 1 -p {} | grep -E "PID|{}|%Cpu|buff/cache" '.format(process_id, process_id, )
sys_out = os.popen(cmd)
sys_out = sys_out.read()

修复

  1. top -n 1不能在 crontab中使用,要加一个参数top -b -n 1
  2. 用 /bin/top 代替 top 命令
python 复制代码
cmd = '/bin/top -b -d 1 -n 1 -p {} | grep -E "PID|{}|%Cpu|buff/cache" '.format(process_id, process_id, )

sys_out = os.popen(cmd)
sys_out = sys_out.read()  

引用

https://blog.51cto.com/zdz8207/3552214

源代码

python 复制代码
def record_process_occupy(process_id=0, process_log_file="", ):
    """
    记录一条这个进程的资源占用情况
    :param process_id: 进程的ID
    :param log_file: 保存top输出的文件
    :return: None
    """

    cmd = '/bin/top -b -d 1 -n 1 -p {} | grep -E "PID|{}|%Cpu|buff/cache" '.format(process_id, process_id, )

    sys_out = os.popen(cmd)
    print(cmd)
    sys_out = sys_out.read()
    sys_out = sys_out.replace("\x1b[7m", "")
    sys_out = sys_out.replace("\x1b(B\x1b[m\x1b[39;49m\x1b(B\x1b[m\x1b[39;49m\x1b[K", "")
    sys_out = sys_out.replace("\x1b(B\x1b[m\x1b[39;49m\x1b[K", "")
    sys_out = sys_out.replace("\x1b(B\x1b[m\x1b[39;49m", "")
    sys_out = sys_out.replace("\x1b(B\x1b[m", '')
    sys_out = sys_out.replace("\x1b[1m", "")
    sys_out = sys_out.split('\n')

    assert len(sys_out) >= 4
    # print(sys_out)
    first_line = "time,"
    first_line += "us,sy,ni,id,wa,hi,si,st,"
    first_line += "total, free, used, buff/cache,"
    first_line += "PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,COMMAND"
    line = ",".join([
        datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        ",".join([x for x in sys_out[0].replace(",", " ").split(" ") if x.replace(".", "").isdigit()]),  # cpu
        ",".join([x for x in sys_out[1].replace(",", " ").split(" ") if x.replace(".", "").isdigit()]),  # mem
        ",".join([x for x in sys_out[3].split(" ") if x]),  # 进程
    ])
    # print(first_line)
    # print(line)
    print("process_log_file", process_log_file)
    if not process_log_file:
        process_log_file = os.path.join(BACKUP_PATH, "process_{}_resource_occupy.csv".format(process_id))
        print()
    print("process_log_file:", process_log_file)
    is_new_file = not os.path.exists(process_log_file)
    with open(process_log_file, 'a') as f:
        if is_new_file:
            f.write(first_line + "\n")
        f.write(line + "\n")

    return True
相关推荐
某林2121 分钟前
机器人重启失联:DDS 发现机制与传输层静默故障
人工智能·python·机器人·硬件架构·ros2
张小姐的猫9 分钟前
【AI大模型接入SDK】 —— Ollama本地接入Deepseek
java·linux·开发语言·网络·c++·人工智能
en.en..19 分钟前
深入解析 fork:一次调用,两次返回的核心原理
linux·运维·服务器
adaierya20 分钟前
用 AI 解决音频转换编程问题
开发语言·人工智能·python·分类·ai编程
ai小陈21 分钟前
PyTorch梯度累积与裁剪实战:小显存也能稳定训练大批次
人工智能·pytorch·python·深度学习·ai·gpu算力
心易行者22 分钟前
用HTML在线运行搭后台管理系统:5个核心模块+0服务器,3天跑通完整业务
大数据·前端·网络·人工智能·python
shirsl3 小时前
算法 Day1-数组 / 哈希 + 双指针
python·算法·哈希算法
kuroomi5 小时前
Docker 与容器基础
linux·运维·docker
广州山泉婚姻9 小时前
Python序列号源码分析
python
计算机源码社9 小时前
【大数据项目实战】基于大数据的影视内容生态综合质量分析与可视化-基于数据挖掘的影视内容类型共现与口碑聚类分析系统
大数据·人工智能·python·数据挖掘·数据分析·毕业设计·课程设计