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


    问题

    用python监控进程占用硬件资源时,手动执行正常运行,定时任务执行出错
    centos的定时任务中,用python的os模块执行top命令时终端没有输出

    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
    • 2
    • 3

    修复

    1. top -n 1不能在 crontab中使用,要加一个参数top -b -n 1
    2. 用 /bin/top 代替 top 命令
    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()  
    
    • 1
    • 2
    • 3
    • 4

    引用

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

    源代码

    
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    NAS折腾记录(一)基础概念介绍
    技术管理者的困惑——技术与管理应该如何平衡?
    论文解读(Graphormer)《Do Transformers Really Perform Bad for Graph Representation?》
    Netty——ByteBuffer消息粘包、半包示例
    基于SSM的食用菌菌棒溯源系统
    [C/C++]数据结构----顺序表的实现(增删查改)
    MongoDB基础【学习笔记】
    前端每日小知识 保持学习
    论文阅读_医疗知识图谱_GraphCare
    HTML+CSS+JS鲜花商城网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计
  • 原文地址:https://blog.csdn.net/qq_39057568/article/details/132877891