В Python, без использования файловой системы / proc, как мне узнать, работает ли данный PID? - PullRequest
5 голосов
/ 29 декабря 2010

Допустим, у меня есть PID, например 555. Я хочу посмотреть, запущен или запущен этот пид.Я могу проверить / proc /, но у меня нет доступа к этому в моей производственной среде.Каков наилучший способ сделать это, если не считать чего-то хакерского, например, открыть канал для «ps»?

Ответы [ 2 ]

11 голосов
/ 29 декабря 2010

Используйте функцию os.kill() с номером сигнала 0. Если процесс pid существует, то вызов будет успешным, иначе он вызовет исключение OSError :

try:
    os.kill(pid, 0)
    print("process exists")
except OSError:
    print("process does not exist")

Документация для kill(2) в моей системе гласит:

Функция kill () отправляет сигнал, передаваемый sig , на pid , процессу или группе процессов. Sig может быть одним из сигналов, указанных в sigaction (2), или может быть 0, и в этом случае выполняется проверка ошибок, но сигнал фактически не отправляется. Это можно использовать для проверки правильности pid .

2 голосов
/ 04 апреля 2011

Используйте os.kill(), как упомянуто Грегом, но поймите, что системный вызов kill проверяет не то, существует ли процесс, а то, можете ли вы отправить уничтожение этому процессу.Один из режимов отказа - если процесс не существует, а другой - у вас нет разрешения на его уничтожение.Чтобы различать, вы должны проверить исключение:

try:
   os.kill(pid, 0)
   print 'Process exists and we can kill it'
except OSError, e:
   if e.errno == 1:
      print 'Process exists, but we cannot kill it'
   else:
      raise

Это не требуется, если вы знаете, что у вас всегда будет разрешение на завершение процесса, который вы проверяете, скажем, потому что вы работаете от имени пользователя root илиизвестно, что процесс выполняется под тем же UID, что и процесс, проверяющий его.

...