os.kill не вызывает ошибку OSError, однако я не вижу, чтобы данный pid работал
Вопрос
На моем сервере 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.
Решение
В Linux каждый процесс и каждый поток имеет свой pid. os.kill
однако не волнует, есть ли у вас pid потока или pid задачи ps
обычно не показывает PID потоков.
Например, на моей машине процесс с 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
(В поисках [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
Вы увидите виновную ветку.
Другие советы
Попробуйте установить htop (sudo apt-get install htop), иногда отображается процесс, которого нет в ps.
Может это баг 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
Я не знаю, почему в некоторых случаях эта OSError не возникает, но важно отметить, что в ОС Linux и Unix существует максимальное значение pid:
$> cat /proc/sys/kernel/pid_max
32768