我有一个长期运行的Python进程,我希望能够在它挂起并停止报告进度的情况下终止。但是我想用一种能够安全清理的方式发出信号,以防万一它没有完全挂断,并且还有一些东西可以正常响应信号。直接杀死它之前发送信号的最佳顺序是什么?正确的信号顺序来安全地停止进程
目前,我正在做这样的事情:
def safe_kill(pid):
for sig in [SIGTERM, SIGABRT, SIGINT, SIGKILL]:
os.kill(pid, sig)
time.sleep(1)
if not pid_exists(pid):
return
是否有更好的秩序?我知道SIGKILL完全绕过了这个过程,但是在SIGTERM/SIGABRT/SIGINT之间有没有什么重大区别,或者就Python而言它们都具有相同的效果?
如果您希望在任何这些信号之后进行清理,您将需要注册信号处理程序的过程。我不认为Python会将其中的任何一个变成例外;它只是停止。 – user2357112
我认为这里的答案取决于你试图优雅地杀死的python进程 - 它是否注册任何信号处理程序?如果是这样,他们记录在案吗?如果它没有注册任何处理程序,那么我想它并不重要你先发送什么;-) – mgilson
@ user2357112 - SIGINT变成了'KeyboardInterrupt' IIRC ... – mgilson