优雅地终止后台Python脚本

3

我正在使用命令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 - Chen A.
1
@Vinny,信号9是SIGKILL... - Maya
1
谢谢!kill -s 2 PID 命令完美运行。 - henneray
2个回答

2
您可以使用signal模块捕获通过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')

使用 kill PID 命令时,finally 子句似乎不会被执行。 - henneray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接