Вопрос

Как мне получить список всех запущенных процессов из Python в Unix, содержащий имя команды/процесса и идентификатор процесса, чтобы я мог фильтровать и уничтожать процессы.

Это было полезно?

Решение

В Linux самым простым решением, вероятно, будет использование внешнего ps команда:

>>> import os
>>> data = [(int(p), c) for p, c in [x.rstrip('\n').split(' ', 1) \
...        for x in os.popen('ps h -eo pid:1,command')]]

В других системах вам, возможно, придется изменить параметры на ps.

Тем не менее, вы можете захотеть запустить man на pgrep и pkill.

Другие советы

В Linux с достаточно новой версией Python, включающей subprocess модуль:

from subprocess import Popen, PIPE

process = Popen(['ps', '-eo' ,'pid,args'], stdout=PIPE, stderr=PIPE)
stdout, notused = process.communicate()
for line in stdout.splitlines():
    pid, cmdline = line.split(' ', 1)
    #Do whatever filtering and processing is needed

Возможно, вам придется немного изменить команду ps в зависимости от ваших конкретных потребностей.

Правильное портативное решение на Python использует psutil.У вас есть разные API для взаимодействия с PID:

>>> import psutil
>>> psutil.pids()
[1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, ..., 32498]
>>> psutil.pid_exists(32498)
True
>>> p = psutil.Process(32498)
>>> p.name()
'python'
>>> p.cmdline()
['python', 'script.py']
>>> p.terminate()
>>> p.wait()

...и если вы хотите «найти и убить»:

for p in psutil.process_iter():
    if 'nginx' in p.name() or 'nginx' in ' '.join(p.cmdline()):
        p.terminate()
        p.wait()

Почему Питон?
Вы можете напрямую использовать killall по имени процесса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top