os.kill未引发OSError,但我不见指定的pid在运行
在我的Ubuntu服务器上,我运行了以下命令:
python -c 'import os; os.kill(5555, 0)'
这样做是为了查看进程号为5555的程序是否在运行。根据我的理解,如果这个进程没有在运行,应该会出现一个OSError(操作系统错误)。但是我没有收到这个错误,这意味着这个进程应该是正在运行的。不过,当我运行:
ps aux | grep 5555
我却没有看到这个进程在运行。类似的情况也发生在其他一些进程号在这个范围内的进程上,但像555或55555这样的进程号就没有这个问题。
有没有人能告诉我,为什么os.kill这个命令没有像预期那样引发OSError?
注意:这是在Python 2.5.1版本下运行的。
4 个回答
1
试着安装一下htop(用命令sudo apt-get install htop),有时候它能显示出ps看不到的进程。
1
可能在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
7
在Linux系统中,每个进程和每个线程都有不同的进程ID(pid)。使用os.kill
命令时,它并不在乎你是用线程的pid还是任务的pid,不过通常情况下,ps
命令不会显示线程的pid。
举个例子,在我的电脑上,进程PID为8502的进程正在运行一些线程,你可以这样查看:
$ ls /proc/8502/task/
8502 8503 8504 8505 8506 8507 8511 8512 8514 8659
注意,8503这个pid在进程列表中并没有出现。
$ 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
你就能找到那个有问题的线程了。