我有一個長期運行的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