os.kill未引发OSError,但我不见指定的pid在运行

5 投票
4 回答
2567 浏览
提问于 2025-04-15 16:34

在我的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

你就能找到那个有问题的线程了。

撰写回答