2017-10-07 193 views
0

我正在後臺運行一個python腳本,使用命令python script.py &。腳本可能看起來像這樣。很好地終止後臺python腳本

import time 

def loop(): 
    while True: 
     time.sleep(1) 

if __name__=='__main__': 
    try: 
     loop() 
    except KeyboardInterrupt: 
     print("Terminated properly") 

說到終止腳本,我想在停止之前做一些清理操作(例如打印「終止正常」)。如果我作爲當前進程運行,則在鍵盤中斷後將由except語句處理。使用kill PID命令意味着清理從不執行。如何停止後臺進程並在代碼終止之前執行一些代碼行?

+1

您可以使用'kill -s 2 PID'來發送鍵盤中斷來處理'PID'。呃......如果我的記憶沒有錯誤,它應該是信號「2」。 – Sraw

+1

'kill'發送的信號不是'KeyboardInterrupt'。默認情況下,它發送'INT(2)'你可以在這裏閱讀更多關於它的信息http://linuxcommand.org/lc3_man_pages/kill1.html – Vinny

+1

@Vinny signal 9 is SIGKILL ... – NieDzejkob

回答

0

可以使用信號模塊來抓取通過kill發送到您的腳本中的任何信號。 您設置了一個信號處理程序來捕獲將執行清理的問題信號。

import signal 
import time 

running = 0 

def loop(): 
    global running 
    running = 1 
    while running: 
     try: time.sleep(0.25) 
     except KeyboardInterrupt: break 
    print "Ended nicely!" 

def cleanup (signumber, stackframe): 
    global running 
    running = 0 

signal.signal(signal.SIGABRT, cleanup) 
signal.signal(signal.SIGTERM, cleanup) 
signal.signal(signal.SIGQUIT, cleanup) 
loop() 
0

使用finally條款:

def loop(): 
    while True: 
     time.sleep(1) 

if __name__=='__main__': 
    try: 
     loop() 
    except KeyboardInterrupt: 
     print("Terminated properly") 
    finally: 
     print('executes always') 
+0

使用'kill PID'命令時'finally'子句似乎不會被執行。 – henneray

+0

請檢查這個Q/A [如何在Python中殺死之前運行最後一個函數?](https://stackoverflow.com/questions/930519/how-to-run-one-last-function-before-getting-殺式的Python)。 – temasso