これは Linux サーバーであると言ったので、外部の ps を呼び出します バイナリは通常、/proc からの情報を使用するよりも遅く、より多くのリソースを使用し、エラーが発生しやすくなります。
誰も言及していないので、1 つの簡単な方法は次のとおりです。
glob.glob('/proc/[0-9]*/')
頑張ってください。
Python サブプロセスを開始/停止するには、subprocess モジュールを使用できます。それらが実行されているかどうかを確認するには、psutil を使用できます:
>>> import psutil
>>> pid = 1034 # some pid
>>> psutil.pid_exists(pid)
True
>>>
...またはこれ (PID が再利用されているかどうかも確認します):
>>> p = psutil.Process(pid)
>>> p.is_running()
True
>>>
これは私が使用するものです。これは procfs を使用します (そのため、Unix のようなシステムに限定され、Mac では動作しないと思います) と前述の glob を使用します。また、プロセスを識別するためのコマンドラインも取得します。プロセスを強制終了するには、 os.kill(signal.SIGTERM, pid)
を使用できます .サブプロセスを使用するには、この投稿を確認してください Python, Popen and select - waiting for a process to terminate or a timeout
def list_processes():
"""
This function will return an iterator with the process pid/cmdline tuple
:return: pid, cmdline tuple via iterator
:rtype: iterator
>>> for procs in list_processes():
>>> print procs
('5593', '/usr/lib/mozilla/kmozillahelper')
('6353', 'pickup -l -t fifo -u')
('6640', 'kdeinit4: konsole [kdeinit]')
('6643', '/bin/bash')
('7451', '/usr/bin/python /usr/bin/ipython')
"""
for pid_path in glob.glob('/proc/[0-9]*/'):
# cmdline represents the command whith which the process was started
f = open("%s/cmdline" % pid_path)
pid = pid_path.split("/")[2] # get the PID
# we replace the \x00 to spaces to make a prettier output from kernel
cmdline = f.read().replace("\x00", " ").rstrip()
f.close()
yield (pid, cmdline)
実行中のプロセスのリストは、/proc ディレクトリの内容を調べることで確認できます (「ps」などのコア ユーティリティを使用しても)。
そのため、実行中のプロセスを照会するために関心のあるライブラリは、他のファイルやディレクトリを操作するために使用されるものと同じです (つまり、sys
または os
、あなたが求めているフレーバーに応じて。 os.path
に特に注意してください ただし、それはあなたが求めていることのほとんどを行います)。プロセスを終了するか、その他の方法で対話するには、プロセスにシグナルを送信します。これは os.kill
で実行されます .最後に、os.popen
を使用して新しいプロセスを開始します