os.kill은 Oserror를 올리지 않지만 주어진 PID가 실행되지 않습니다.
문제
Ubuntu 서버에서 다음 명령을 실행합니다.
python -c 'import os; os.kill(5555, 0)'
이것은 PID 5555가 실행 중인지 확인할 수 있도록 완료됩니다. 내가 이해하면 PID가 실행되지 않으면 이것은 오스로르를 높여야합니다. 이것은 나에게 oserror를 올리는 것이 아닙니다. 이는 그것이 실행되는 프로세스 여야한다는 것을 의미합니다. 그러나 내가 달릴 때 :
ps aux | grep 5555
나는 그 PID로 진행되는 과정이 보이지 않는다. 이것은 또한 일반 범위의 다른 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
나타나지 않을 것입니다 - 그것은 오래된 유닉스 트릭입니다!)
이제 그것이 살아 있는지 아닌지 보자
$ 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 설치 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 기반 OS에는 최대 PID 값이 있다는 점에 유의해야합니다.
$> cat /proc/sys/kernel/pid_max
32768