我有一个启动子进程的服务器,我可以设法做一个send_signal(SIGTERM)来终止进程。但并不优雅。
如果我从shell调用我的子进程(即作为一个单独的进程),定义的信号处理程序将正常地启动和退出。在
在服务器.py:
(所以。。在另一个脚本中,我首先调用start_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)
在应用程序副本在
^{pr2}$
再说一次,如果我打电话的话应用程序副本从shell发送一个SIGTERM信号,我得到一个跟踪Terminate signal received,应用程序关闭。
但什么时候应用程序副本是由服务器启动的,我在服务器中调用exit_app,我得到一个跟踪Subprocess is alive(来自服务器.py)app被杀死,但信号没有被app的signalhandlerexit_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))
这也许能回答我的问题,但我还是不谈。。。在