用于监视进程和子进程的Python脚本

时间:2015-06-11 12:14:06

标签: python linux algorithm subprocess psutil

我有一个Python脚本,用于监视进程及其子进程以获取进程的CPU和内存利用率。

脚本不断检查进程或其子进程之一是否为Active。一旦进程及其所有子进程处于Inactive状态,Python脚本就会退出。

因此,我在这里针对特定流程所面临的问题是 -

  1. 流程开始
  2. 流程创建子流程-1
  3. 流程创建子流程-2
  4. 流程创建子流程-3(最后时刻为Active
  5. 终止子流程-3 (此时流程及其所有子流程均为Inactive
  6. 流程创建子流程-4(最后时刻为Active
  7. 因此,如果我的脚本在[5]检查进程或其中一个子进程是Active,它将返回false并终止!

    简而言之:进程及其所有子进程处于Inactive状态的时间跨度很短(即子进程被终止和新子进程之间的时间尚未到来生成)。如果我的脚本在这个时间点检查状态,它将返回false,因为一切都处于非活动状态。

    有谁可以请我解决这个问题或解决这个问题?

    while(bIsProcessActive == True):
        bIsProcessActive = False
        if (proc.is_running() and proc.status != psutil.STATUS_ZOMBIE):
            bIsProcessActive = True
            cpu_usage = proc.get_cpu_percent(interval = 2)
            memory_usage = proc.get_memory_info().rss
        for child in proc.get_children():
            if child.is_running() and child.status != psutil.STATUS_ZOMBIE:
                // Add to memory and CPU usage of parent process
                if bIsProcessActive == False and childutilization[0] == True:
                    bIsProcessActive = True
    

1 个答案:

答案 0 :(得分:2)

由于您的过程可以让孩子在父母的死亡中幸存下来,因此您无法仅根据父母信息有效地监控孩子,因为当父母退出时孩子的父母ID变为1 - 如果您没有#39;设法在父母死亡之前获得孩子ID,你不能再找到它了。

解决此问题的一种方法是使用进程组ID (pgid):进程及其所有后代将具有相同的pgid。 只有在后代不在流程组领导者中进行自我改造时才有效,所以假设这一点在未来都是真实的。

考虑到这一点,您可以随时扫描正在运行的进程并找到子进程,即使父进程已不再运行。

如果监视脚本本身成为进程组负责人,则可能有所帮助 - 将pgid仅限制为其后代。

看看:

  • os.setpgrp()
  • os.getpgrp()
  • ps -eo pid,ppid,pgid

我在一个名为BuildIn的sw构建分析工具的监视脚本中使用了这种技术,你可以在这里查看它:https://buildin.apartsw.com/wrap.html。对不起,广告