• 【修复】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
  • 相关阅读:
    Java类的生命周期和子类实例化对象的过程
    北京/上海/广州/深圳DAMA-CDGA/CDGP数据治理认证报名条件
    Ansible中的角色使用
    点云入门知识
    32个关键字详解①(C语言)
    如何在docker中运行windows
    Python——Python添加解释器Interpreter怎么选?
    【Unity3D】Unity与Android交互
    【AI视野·今日Sound 声学论文速览 第八期】Wed, 20 Sep 2023
    Privacy-preserving record linkage on large real world datasets论文总结
  • 原文地址:https://blog.csdn.net/qq_39057568/article/details/132877891