很好地终止后台python脚本

很好地终止后台python脚本

问题描述:

我正在后台运行一个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

可以使用信号模块来抓取通过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() 

使用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://*.com/questions/930519/how-to-run-one-last-function-before-getting-杀式的Python)。 – temasso