без него это убьет и родителя.
я есть сервер, который запускает подпроцесс, и я могу сделатьsend_signal(SIGTERM)
который убьет процесс. Но не изящно. Если я вызываю свой подпроцесс из оболочки (т. Е. Как отдельный процесс), определенный обработчик сигнала включается и завершается корректно.
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())
Опять же, если я позвоню app.py из оболочки и отправлюSIGTERM
сигнал я получаю след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))
Это, вероятно, отвечает на мой вопрос, но я оставлю это открытым ...