2009-12-01 74 views
3

在我的Ubuntu服務器特定的PID我運行下面的命令:os.kill不是拋出一個OSERROR,但我沒有看到運行

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

這樣做,這樣我可以在PID 5555看到正在運行。根據我的理解,如果pid沒有運行,這應該會引發OSError。這不是爲我提出一個OSError,這意味着它應該是一個正在運行的進程。但是,當我運行時:

ps aux | grep 5555 

我看不到進程與該pid運行。這也發生在該範圍內的其他幾個pid上,但555或55555不會發生這種情況。

有沒有人知道爲什麼os.kill不會像預期的那樣引發OSError?

注意:這是在python 2.5.1下運行的。

回答

6

在Linux中,每個進程每個線程都有廣告:要注意,在Linux和基於UNIX操作系統一個最大PID值是非常重要的不同的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 

(GR埃平爲[8]503grep不會出現 - 這是一個老的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 

您將看到的罪魁禍首線程。

+0

'grep [8] 503'可能是一個老的Unix技巧,但是'ps -p8503'幾乎是舊的,允許多個參數*和*也不會選擇其他進程(比如18503和28503)。 – tzot 2009-12-22 22:43:25

1

嘗試安裝htop(sudo apt-get install htop),它有時會顯示ps沒有的過程。

+0

在htop中看不到任何東西,使用它的搜索功能。 – 2009-12-01 15:47:49

+0

實際上在手動搜索它而不是使用搜索的東西之後,我確實找到了那裏的pid。感謝e-satis。 – 2009-12-01 16:24:26

1

也許這是2.5中的錯誤?在2.6.4,我得到:

[email protected]:~$ 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

+0

這是我得到的一些pid的結果,但不是5555 – 2009-12-01 15:38:10

+0

我發佈了一個關於類似的東西的錯誤報告的鏈接。 – gruszczy 2009-12-01 15:40:51

0

我不知道爲什麼OSERROR不是在某些情況下提出的,但

$> cat /proc/sys/kernel/pid_max 
32768 
相關問題