1

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

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

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

  1. 进程开始
  2. 流程创建子流程-1
  3. 流程创建子流程2
  4. 流程创建子流程3(Active最迟时刻)
  5. Terminate sub-process-3 (此时该流程及其所有子流程为Inactive
  6. 流程创建子流程4(Active最迟时刻)

因此,如果我的脚本检查进程或其中一个子进程是否Active位于 [5],它将返回 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
4

1 回答 1

2

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

解决此问题的一种方法是改用进程组 ID (pgid):进程及其所有后代将具有相同的 pgid。仅当后代没有在流程组领导中转变自己时才有效,因此假设这在未来是正确的。

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

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

看着:

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

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

于 2015-06-11T14:05:12.230 回答