代码之家  ›  专栏  ›  技术社区  ›  Bryan McLemore

kill没有引发操作错误,但是我看不到给定的pid正在运行

  •  4
  • Bryan McLemore  · 技术社区  · 16 年前

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

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

    这样做是为了查看pid 5555是否正在运行。据我所知,如果pid没有运行,这将导致操作错误。这并没有给我带来操作错误,这意味着它应该是一个正在运行的进程。然而,当我跑步时:

    ps aux | grep 5555
    

    我看不到任何进程使用该pid运行。这种情况也会发生在该范围内的其他几个PID上,但在555或55555上不会发生。

    有人知道为什么os.kill不会像预期的那样引发操作系统错误吗?

    注意:这是在Python2.5.1下运行的。

    4 回复  |  直到 16 年前
        1
  •  7
  •   Nick Craig-Wood    16 年前

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

    你会看到罪犯的线索。

        2
  •  1
  •   Bite code    16 年前

        3
  •  1
  •   gruszczy    16 年前

    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
    

    我相信,这方面有一个bug报告:

    http://mail.python.org/pipermail/new-bugs-announce/2009-February/004222.html

        4
  •  0
  •   hwnd    16 年前

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

    $> cat /proc/sys/kernel/pid_max
    32768