我有一个Python脚本,用于监视进程及其子进程以获取进程的CPU和内存利用率。
脚本不断检查进程或其子进程之一是否为Active
。一旦进程及其所有子进程处于Inactive
状态,Python脚本就会退出。
因此,我在这里针对特定流程所面临的问题是 -
Active
)Inactive
) Active
)因此,如果我的脚本在[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
答案 0 :(得分:2)
由于您的过程可以让孩子在父母的死亡中幸存下来,因此您无法仅根据父母信息有效地监控孩子,因为当父母退出时孩子的父母ID变为1 - 如果您没有#39;设法在父母死亡之前获得孩子ID,你不能再找到它了。
解决此问题的一种方法是使用进程组ID (pgid):进程及其所有后代将具有相同的pgid。 只有在后代不在流程组领导者中进行自我改造时才有效,所以假设这一点在未来都是真实的。
考虑到这一点,您可以随时扫描正在运行的进程并找到子进程,即使父进程已不再运行。
如果监视脚本本身成为进程组负责人,则可能有所帮助 - 将pgid仅限制为其后代。
看看:
我在一个名为BuildIn的sw构建分析工具的监视脚本中使用了这种技术,你可以在这里查看它:https://buildin.apartsw.com/wrap.html。对不起,广告