4

Linux の python にこのスクリプトがあり、vnc をローカルに展開し、この vnc 画面でグラフィカルなジョブを実行し、vnc を強制終了します。ジョブが完了した後、gnome-panel という名前のプロセスがハングし、CPU 使用率が 100% のままになることがあります。次に、パテを介してログインし、それらすべてのプロセスを手動で強制終了する必要があります (実際には多くの場合もあります)。ジョブが終了したら、Pythonスクリプトにいくつかの行を追加したいと思います。これにより、vncが強制終了されるだけでなく(既に実行されています)、特定の期間に一定量のCPUを消費した場合はgnome-panelも強制終了されます。一部のパネルは正常に動作しているため、すべての gnome-panels を単純に強制終了することはできません (同時に 4 つの vnc スクリーンをデプロイしています)。

だから私はPythonでこの条件が必要です:

プロセス名が gnome-panel で、CPU の 80% 以上を消費し、1 分以上実行されている場合、プロセス ID を強制終了します

ありがとう!

4

4 に答える 4

2

ライブラリを使用してpsutilプロセスの CPU パーセントを取得し、最終的にそれらを強制終了できます。このライブラリは、Linux、Windows、Solaris、FreeBSD、および OS X の 32 ビットと 64 ビットの両方で、2.4 から 3.3 (および PyPy) までの Python で動作します。

次の(テストされていない)コードは、あなたが望むことをするはずです:

gnome_panel_procs = []
for process in psutil.process_iter():
    # I assume the gnome-panel processes correctly set their name
    # eventually you could use process.cmdline instead
    if process.name == 'gnome-panel':
        gnome_panel_procs.append(process)

for proc in gnome_panel_procs:
    for _ in range(60):
        # check cpu percentage over 1 second
        if proc.get_cpu_percent(1) < 80 or not proc.is_running():
            # less than 80% of cpu or process terminated
            break
    else:
        # process used 80% of cpu for over 1 minute
        proc.kill()

注: 呼び出すことで、提案された他のソリューションで発生する可能性のある再利用のis_running()問題を防ぐことができます (可能性は非常に低いですが)。pid


プロセスが 1 分以上前に開始され、現在 80% 以上の CPU を使用しているかどうかを確認したい場合は、より簡単な方法を使用できます。

import time
import psutil

for proc in psutil.process_iter():
    if proc.name == 'gnome-panel' and time.time() - proc.create_time > 1:
        if proc.get_cpu_percent() > 80:
            proc.kill()

これによりgnome-panel、直前の 1 分間はあまり CPU を使用していなくても、最後の数秒間だけのプロセスが強制終了されます。

于 2013-08-27T09:59:46.347 に答える
1
import os

os.system(' ps aux| grep gnome-panel | awk \'{if($3>80) print $2}\' |xargs kill -9 ') 
于 2013-08-27T09:03:01.507 に答える
0

ps aux の結果を取得するために、これはすでにここに実装されているようです

ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]
processes = ps.split('\n')
# this specifies the number of splits, so the splitted lines
# will have (nfields+1) elements
nfields = len(processes[0].split()) - 1
processes = [row.split(None, nfields) for row in processes[1:]]

プロセスの例は次のとおりです。

['greg', '6359', '0.0', '0.1', '16956', '8868', 'pts/3', 'S+', '01:40', '0:00', 'python']

その後、すべてのプロセスをループして終了できます

for process in processes:
    if "gnome-terminal" in process[-1] \
        and float(process[2]) > 0.8 \
            and int(process[-2].split(":")[-1]) > 1: 
        subprocess.call(["kill", "-9", process[0]])

これを行うためのハックの少ない方法があると確信しています

于 2013-08-27T08:42:12.157 に答える
0

ps補助 | grep 'gnome-panel' | awk '{if ($3>80)print $2}' | xargs kill -9

于 2013-08-27T08:25:17.963 に答える