os.kill은 Oserror를 올리지 않지만 주어진 PID가 실행되지 않습니다.

StackOverflow https://stackoverflow.com/questions/1826824

  •  11-09-2019
  •  | 
  •  

문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top