【问题标题】:Problems killing a process with Python on Solaris在 Solaris 上使用 Python 杀死进程的问题
【发布时间】:2011-06-09 17:38:41
【问题描述】:

我有一个名为 C 的 C++ 程序,它被设计为在收到 SIGINT 信号时关闭。我编写了一个 Python 程序 P,它将 C 作为子进程运行。我想让 P 停止 C。我尝试了 3 件事,我想知道为什么其中一些不起作用。

尝试 #1:

import subprocess
import signal
import os

p = subprocess.Popen(...)
...
os.killpg(p.pid, signal.SIGINT)

这段代码给了我错误

OSError [Errno 3]: No such process`

即使p.pidps 显示的pid 匹配。

尝试 #2:

import subprocess
import signal
import os

p = subprocess.Popen(...)
...
os.system('kill -SIGINT %u' % p.pid)

这给了我错误

sh: kill: bad signal`

即使kill -SIGINT <pid> 在终端上工作。

尝试 #3:

import subprocess
import signal
import os

p = subprocess.Popen(...)
...
os.system('kill -2 %u' % p.pid)

这行得通。

我的问题是,为什么 #1 和 #2 不起作用?


编辑:我最初的假设是,因为os.kill() 的文档说New in version 2.7: Windows support,我认为os.kill() 是(a)首先在 2.7 中可用并且(b)在 Windows 中工作。阅读下面的答案后,我在 Solaris 上运行了os.kill(),对不起,我首先应该这样做,它在 2.4 中确实有效。显然,文档意味着 Windows 支持是 2.7 中的新功能。哎呀。

【问题讨论】:

    标签: python solaris kill


    【解决方案1】:

    第一个失败是因为os.killpg 杀死了一个进程group,由其领导者标识;您有一个简单的流程,而不是流程组。请改用os.kill。第二个失败,因为内置的 shell kill 理解符号信号,但 Solaris 上的外部命令不理解(而在 *BSD 和 Linux 上它可以);使用数字信号(SIGINT 在 Solaris 上是 2,或者使用 Python 的来自 signal 模块的预定义信号常量)。也就是说,使用Popen 自己的界面,而不是其他人提到的;不要重新发明轮子,你很容易创造一些角落。

    【讨论】:

    • Solaris 上的/usr/bin/kill 外部命令接受不带SIG 前缀的符号名称,因此kill -INT 应该可以工作。
    【解决方案2】:

    Popen 对象有一个您可以调用的kill() 方法以及一个terminate() 方法和一个通用send_signal() 方法。

    我会使用其中的一种,而不是尝试使用os 接口的任何带外功能。你已经掌握了这个过程,你应该使用它!

    【讨论】:

    • 不幸的是,我使用的是 python 2.4,所有这些功能都是在 python 2.6 中添加的。
    • 我才意识到,我在重写问题时,不小心删除了版本信息。抱歉,不清楚!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2021-11-30
    • 2018-12-20
    相关资源
    最近更新 更多