在Solaris上使用Python杀死进程的问题

时间:2011-06-09 17:38:41

标签: python solaris kill

我有一个名为 C 的C ++程序,用于在收到SIGINT信号时关闭。我编写了一个运行 C 作为子进程的Python程序 P 。我希望 P 停止 C 。我尝试了3件事,我想知道为什么有些东西不起作用。

尝试#1:

import subprocess
import signal
import os

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

此代码给出了错误

  

OSError [Errno 3]:没有这样的过程`

即使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中的新功能。 OPPS。

2 个答案:

答案 0 :(得分:5)

第一个失败是因为os.killpg杀死了由其领导者识别的进程;你有一个简单的过程,而不是一个过程组。请尝试使用os.kill。第二个失败是因为shell内置kill了解符号信号,但Solaris上的外部命令却没有(而在* BSD和Linux上它);在Solaris上使用数字信号(SIGINT2,或使用来自signal模块的Python预定义信号常量)。也就是说,使用Popen自己的界面,而不是别人提到的;不要重新发明轮子,你可能会产生一些角落。

答案 1 :(得分:1)

Popen对象有kill()方法,您可以调用terminate()方法和通用send_signal()方法。

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