1

プロセスとそのサブプロセスを監視して、プロセスによる CPU とメモリの使用率を監視する Python スクリプトがあります。

スクリプトは、プロセスまたはそのサブプロセスの 1 つが であるかどうかを継続的にチェックしますActive。プロセスとそのすべてのサブプロセスが特定のInactive状態になると、Python スクリプトは終了します。

したがって、特定のプロセスでここで直面している問題は-

  1. プロセス開始
  2. プロセスはサブプロセス-1 を作成します
  3. プロセスはサブプロセス 2 を作成します
  4. プロセスはサブプロセス-3 を作成します (Active最新の時点で)
  5. サブプロセス 3 を終了します(この時点で、プロセスとそのすべてのサブプロセスは終了しますInactive) 。
  6. プロセスはサブプロセス 4 を作成します (Active最新の時点で)

したがって、スクリプトがプロセスまたはサブプロセスの 1 つが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を取得できなかった場合親の死はもう見つけることができません。

これに対処する 1 つの方法は、代わりにプロセス グループ 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 に答える