Как проще всего узнать, существует ли в Python процесс с данным pid? - PullRequest
7 голосов
/ 17 июня 2009

В системе POSIX я хочу посмотреть, работает ли данный процесс (например, PID 4356). Было бы еще лучше, если бы я мог получить метаданные об этом процессе.

Ответы [ 6 ]

11 голосов
/ 17 июня 2009

Вместо os.waitpid вы также можете использовать os.kill с сигналом 0:

>>> os.kill(8861, 0)
>>> os.kill(12765, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 3] No such process
>>> 

Редактировать: более подробно:

import errno
import os

def pid_exists(pid):
    try:
        os.kill(pid, 0)
    except OSError, e:
        return e.errno == errno.EPERM
    else:
        return True

Это прекрасно работает на моей Linux-коробке. Я не проверял, что «signal 0» на самом деле Posix, но он всегда работал на каждом варианте Unix, который я пробовал.

4 голосов
/ 17 июня 2009

В Linux, по крайней мере, каталог / proc имеет то, что вы ищете. Это в основном системные данные ядра, представленные в виде каталогов и файлов. Все числовые каталоги являются деталями процессов. Просто используйте основные функции Python OS, чтобы получить эти данные:

#ls /proc
1      17    18675  25346  26390  28071  28674  28848  28871  29347  590   851   874  906   9621  9655       devices      iomem     modules ...

#ls /proc/1
auxv  cmdline  cwd  environ  exe  fd  maps  mem  mounts  root  stat  statm  status  task  wchan

#cat /proc/1/cmdline
init [3]
3 голосов
/ 20 ноября 2010

Переносимым способом, используя psutil (https://github.com/giampaolo/psutil)

>>> import psutil, os
>>> psutil.pid_exists(342342)
False
>>> psutil.pid_exists(os.getpid())
True
>>> 
1 голос
/ 17 июня 2009

Посмотрите на /proc/pid. Это существует только из запущенного процесса и содержит много информации.

0 голосов
/ 17 июня 2009

Один из способов получения информации:

import commands
output = commands.getstatusoutput("ps -ef | awk '{print $2}' | grep MYPID")

См .: http://docs.python.org/library/commands.html

Я думаю:

commands.getoutput(...) 

может использоваться для получения метаданных, доступных в строке 'ps'. Поскольку вы используете систему POSIX, я думаю, что ps (или эквивалентный) будет доступен (например, prstat в Solaris).

0 голосов
/ 17 июня 2009

os.waitpid() могут помочь:

try:
    os.waitpid(pid, 0)
except OSError:
    running = False
else:
    running = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...