Библиотека Python для управления процессами в Linux - PullRequest
13 голосов
/ 10 ноября 2009

Через мой веб-интерфейс я хотел бы запустить / остановить определенные процессы и определить, запущен ли еще запущенный процесс.

Мой существующий веб-сайт основан на Python и работает на сервере Linux, поэтому знаете ли вы подходящую библиотеку, поддерживающую эту функцию?

Спасибо

Ответы [ 7 ]

13 голосов
/ 20 ноября 2010

Чтобы запустить / остановить подпроцессы Python, вы можете использовать модуль подпроцесса. Чтобы проверить, работают ли они, вы можете использовать psutil :

>>> import psutil
>>> pid = 1034  # some pid
>>> psutil.pid_exists(pid)
True
>>>

... или это (он также проверит, был ли PID повторно использован):

>>> p = psutil.Process(pid)
>>> p.is_running()
True
>>>
6 голосов
/ 10 ноября 2009

Проверка списка запущенных процессов выполняется (даже основными утилитами, такими как "ps"), просматривая содержимое каталога / proc.

Таким образом, библиотека, которая вас интересует для запроса запущенных процессов, такая же, как и для работы с любыми другими файлами и каталогами (например, sys или os, в зависимости от того, что вам нужно. Специальная оплата внимание на os.path, хотя, это делает большую часть того, что вы после). Чтобы завершить или иным образом взаимодействовать с процессами, вы отправляете им сигналы, что достигается с помощью os.kill. Наконец, вы запускаете новые процессы, используя os.popen и друзей.

2 голосов
/ 24 декабря 2009

Это то, что я использую. Он использует procfs (так что вы ограничены Unix-подобными системами, я не думаю, что он будет работать на macs) и ранее упомянутый glob. Он также получает командную строку, которая позволяет идентифицировать процесс. Для уничтожения процесса вы можете использовать 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)
2 голосов
/ 10 ноября 2009

Поскольку вы сказали, что это сервер Linux, вызов внешнего двоичного файла ps обычно медленнее, использует больше ресурсов и более подвержен ошибкам, чем прямое использование информации из / proc .

Поскольку никто не упомянул, один простой способ:

glob.glob('/proc/[0-9]*/')

Удачи.

1 голос
/ 10 ноября 2009

Модуль os, вероятно, ваш друг. Например, os.kill, чтобы убить процесс.

С точки зрения получения списка процессов, вы, вероятно, захотите использовать команду ps. Этот вопрос содержит дополнительную информацию по этому вопросу.

0 голосов
/ 12 мая 2011

Я бы использовал 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

0 голосов
/ 10 ноября 2009

Подпроцесс Python http://docs.python.org/library/subprocess.html может вам помочь. Если вы создаете процесс с подпроцессом, вы можете использовать функцию Popen.terminate (), чтобы остановить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...