Библиотека Python для управления процессами Linux
Через мой веб-интерфейс я хотел бы запустить/остановить определенные процессы и определить, запущен ли процесс.
Мой существующий веб-сайт основан на Python и работает на сервере Linux, так что вы знаете подходящую библиотеку, которая поддерживает эту функциональность?
Спасибо
Ответы
Ответ 1
Для запуска/остановки подпроцессов python вы можете использовать модуль подпроцесса.
Чтобы проверить, работают ли они, вы можете использовать psutil:
>>> import psutil
>>> pid = 1034 # some pid
>>> psutil.pid_exists(pid)
True
>>>
... или это (он также проверяет, был ли PID повторно использован):
>>> p = psutil.Process(pid)
>>> p.is_running()
True
>>>
Ответ 2
Проверка списка запущенных процессов выполняется (даже с помощью основных утилит типа "ps" ), просматривая содержимое каталога /proc.
Таким образом, библиотека, которую вы заинтересованы в запросе запущенных процессов, такая же, как и для работы с любыми другими файлами и каталогами (например, sys
или os
), в зависимости от вкуса, которым вы пользуетесь. внимание к os.path
, хотя оно делает большую часть того, что вам нужно). Чтобы прекратить или иным образом взаимодействовать с процессами, вы отправляете им сигналы, которые выполняются с помощью os.kill
. Наконец, вы начинаете новые процессы с помощью os.popen
и друзей.
Ответ 3
Поскольку вы сказали, что это сервер Linux, вызов внешнего двоичного файла ps обычно медленнее, он использует больше ресурсов и больше подвержен ошибкам, чем использование информации из /proc напрямую.
Поскольку никто не упомянул, один простой способ:
glob.glob('/proc/[0-9]*/')
Удачи.
Ответ 4
Это то, что я использую. Он использует procfs (так что вы ограничены Unix-системами, не будете работать на macs, я думаю) и ранее упомянутый glob. Он также получает cmdline, который позволяет вам идентифицировать процесс. Для уничтожения процесса вы можете использовать os.kill(signal.SIGTERM, pid)
. Для использования подпроцесса, пожалуйста, отметьте это сообщение Python, Popen и выберите - ожидающий завершения процесса или тайм-аута
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)
Ответ 5
Модуль os, вероятно, ваш друг. Там os.kill
, например, чтобы убить процесс.
Что касается получения списка процессов, вы, вероятно, захотите выполнить команду ps
. Этот вопрос содержит дополнительную информацию.
Ответ 6
Подпроцесс Python http://docs.python.org/library/subprocess.html может вам помочь. Если вы создаете процесс с подпроцессом, вы можете использовать функцию Popen.terminate(), чтобы остановить его.
Ответ 7
Я бы использовал PSutil. Чтобы обеспечить практический пример:
import psutil
for proc in psutil.get_process_list():
if proc.username == 'yourusername':
if myappname in proc.cmdline:
print 'App is running'
В качестве альтернативы Red Hat использует и поддерживает модуль Python под названием python-linux-procfs, который изначально анализирует /proc для управления процессами. он не очень хорошо рекламируется, но предоставляет некоторые дополнительные специфичные для Linux функции (например, класс планирования), которые иногда полезны.
http://pkgs.fedoraproject.org/gitweb/?p=python-linux-procfs.git