4

在我的 ubuntu 服务器上,我运行以下命令:

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 下运行的。

4

4 回答 4

7

在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

(Grepping for[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

您将看到罪魁祸首线程。

于 2009-12-01T19:23:23.493 回答
1

尝试安装 htop (sudo apt-get install htop),它有时会显示 ps 没有的进程。

于 2009-12-01T15:31:14.693 回答
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

于 2009-12-01T15:35:52.937 回答
0

我不知道为什么在某些情况下没有引发 OSError,但重要的是要注意在基于 linux 和 unix 的操作系统上有一个最大 pid 值:

$> cat /proc/sys/kernel/pid_max
32768
于 2009-12-01T15:57:30.320 回答