【发布时间】:2018-04-28 15:25:13
【问题描述】:
我有一个启动子进程的服务器,我可以设法执行send_signal(SIGTERM),这将终止该进程。但不优雅。
如果我从 shell 调用我的子进程(即作为单个进程),定义的信号处理程序将启动并正常退出。
server.py:
(所以..从另一个脚本我先调用start_app(),然后再调用exit_app()
def start_app():
app = subprocess.Popen("python app.py")
def exit_app():
p = app.poll()
if p==None:
print("Subprocess is alive") # debug
app.send_signal(signal.SIGTERM)
app.py
def exit_signal_handler(signal, frame):
print("Terminate signal received")
app.exit()
if __name__ == '__main__':
app = QApplication(sys.argv)
signal.signal(signal.SIGTERM, exit_signal_handler)
signal.signal(signal.SIGINT, exit_signal_handler)
sys.exit(app.exec())
再次,如果我从 shell 调用 app.py 并发送 SIGTERMsignal 我会得到跟踪 Terminate signal received 并关闭应用程序。
但是,当 app.py 由服务器启动并且我在服务器中调用 exit_app 时,我得到了一个跟踪 Subprocess is alive(来自 server.py)并且应用程序被杀死但信号未在应用程序的信号处理程序 exit_signal_handler 中捕获
编辑:
在子进程捕获信号的意义上,似乎send_signal() 没有向子进程发送信号到。它发送一个信号,让子进程执行操作:
def send_signal(self, sig):
"""Send a signal to the process
"""
if sig == signal.SIGTERM:
self.terminate()
elif sig == signal.CTRL_C_EVENT:
os.kill(self.pid, signal.CTRL_C_EVENT)
elif sig == signal.CTRL_BREAK_EVENT:
os.kill(self.pid, signal.CTRL_BREAK_EVENT)
else:
raise ValueError("Unsupported signal: {}".format(sig))
这可能回答了我的问题,但我会保持开放......
【问题讨论】:
-
@georgexsh kill = 完成,退出,进程不再在 CPU 上运行。并且
poll()只是作为一个健全性检查,以在发送SIGTERM之前查看子进程实际上是活动的 -
所以真正的问题是您还没有看到应该打印信号处理程序的消息?尝试写入文件?
-
@georgexsh 嗯...好点。我知道你打算用这个去哪里,但是当以
subprocess()运行时,__main__中发生的事情会被打印出来。我也有print(),但这里没有包含它。 -
您可以通过将日志写入文件来确认这一点,并检查
app.poll()的返回值是0还是-15,0表示正常退出并且信号处理程序工作。 -
在您的新编辑中,您使用的是 windows 吗?
标签: python windows python-3.x subprocess signals