os.kill не вызывает OSError, однако я не вижу запущенного pid - PullRequest
4 голосов
/ 01 декабря 2009

На моем сервере Ubuntu я запускаю следующую команду:

python -c 'import os; os.kill(5555, 0)'

Это сделано для того, чтобы я мог видеть, запущен ли pid 5555. Насколько я понимаю, это должно вызвать ошибку OSError, если pid не запущен. Это не вызывает для меня OSError, что означает, что это должен быть запущенный процесс. Однако, когда я бегу:

ps aux | grep 5555

Я не вижу процессов, работающих с этим pid. Это также происходит с некоторыми другими пидами в этом общем диапазоне, но не происходит, скажем, с 555 или 55555.

Кто-нибудь знает, почему os.kill не вызывает OSError, как ожидается?

Примечание: это работает под python 2.5.1.

Ответы [ 4 ]

7 голосов
/ 01 декабря 2009

В linux каждый процесс и каждого потока имеет свой pid. os.kill не имеет значения, есть ли у вас pid потока или pid задачи, однако ps обычно не показывает pids потока.

Например, на моей машине процесс с PID 8502 запускает потоки, которые вы можете видеть вот так

$ ls /proc/8502/task/
8502  8503  8504  8505  8506  8507  8511  8512  8514  8659

Обратите внимание, что 8503 не отображается в списке процессов

$ ps aux | grep [8]503
$

Однако, используя еще несколько ps аргументов, вы можете увидеть это

$ ps -eLf | grep [8]503
ncw       8502     1  8503  0   10 10:00 ?        00:00:00 /usr/lib/virtualbox/VBoxSVC --automate

(Grepping для [8]503 означает, что grep не будет отображаться - это старый трюк Unix!)

Теперь давайте посмотрим, жив он или нет

$ python
Python 2.6.4 (r264:75706, Nov  2 2009, 14:44:17)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Loaded customisations from '/home/ncw/.pystartup'
>>> import os
>>> os.kill(8503, 0)
>>>

Это дублирует вашу проблему.

Я думаю, что если вы делаете

ls /proc/*/task/5555

или

ps -eLf | grep [5]555

Вы увидите нить преступника.

1 голос
/ 01 декабря 2009

Может это ошибка в 2.5? На 2.6.4 я получаю:

gruszczy@gruszczy-laptop:~$ python -c 'import os; os.kill(5555, 0)'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
OSError: [Errno 3] No such process

Я считаю, что для этого есть сообщение об ошибке:

http://mail.python.org/pipermail/new-bugs-announce/2009-February/004222.html

1 голос
/ 01 декабря 2009

Попробуйте установить htop (sudo apt-get install htop), иногда он отображает процесс, которого не делает ps.

0 голосов
/ 01 декабря 2009

Я не знаю, почему эта OSError в некоторых случаях не вызывается, но важно отметить, что в ОС Linux на основе Linux и Unix существует максимальное значение pid:

$> cat /proc/sys/kernel/pid_max
32768
...