【发布时间】:2015-05-15 02:47:58
【问题描述】:
我有一个可以启动和关闭进程的类。但是它似乎没有关闭该过程。
我的 python 代码,还有其他方法,但它们工作正常。:
class KismetInstance:
"""Creates a kismet_server instance"""
def __init__(self, value=False):
logging.basicConfig(format='%(asctime)-15s::: %(message)s')
self.logger = logging.getLogger('kismet_instance')
self.example = value
def __create_kismet_instance__(self):
"""
Create a kismet_server subprocess.
:return:
"""
shell = ['sudo', '/usr/local/bin/kismet_server']
self.logger.debug('Attempting to run: %s', " ".join(shell))
self.kismet = Popen(shell, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=r'./logs', preexec_fn=os.setsid)
def __destroy_kismet_instance__(self):
"""
Kill the subprocess
:return:
"""
os.killpg(os.getpgid(self.kismet.pid), 15)
它可以很好地创建子流程。但是当我尝试杀死时出现此错误(没有 sudo)
OSError: [Errno 1] Operation not permitted
如果我使用 sudo 运行,之后进程仍在运行。
pi@raspberrypi ~/project $ ps -A | grep 'kismet'
2912 ? 00:00:00 kismet_server
【问题讨论】:
-
因为子进程是用“sudo”创建的,当你试图杀死它时,它不是从“sudo”或“root”用户发送的。尝试从“root”用户运行程序,它应该可以工作。或者如果你可以在非root帐户下运行/usr/local/bin/kismet_server,那么它也可以工作。
-
如果
kismet正在拦截SIGTERM,您也可以尝试os.killpg(os.getpgid(self.kismet.pid), 2)forSIGINT。 -
@NipunTalukdar 如果您阅读后半部分,我尝试以
sudo运行该程序,但它并没有杀死它。 -
@MartinKonecny 我试过 SIGINT 也没有关闭。
-
您可以尝试进程无法拦截的信号
9SIGKILL,但这会导致程序不干净地关闭,并可能导致数据损坏。您应该这样做只是为了测试您的信号是否被正确发送。
标签: python subprocess kill