很好地终止后台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
命令意味着清理从不执行。如何停止后台进程并在代码终止之前执行一些代码行?
答
可以使用信号模块来抓取通过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')
您可以使用'kill -s 2 PID'来发送键盘中断来处理'PID'。呃......如果我的记忆没有错误,它应该是信号“2”。 – Sraw
'kill'发送的信号不是'KeyboardInterrupt'。默认情况下,它发送'INT(2)'你可以在这里阅读更多关于它的信息http://linuxcommand.org/lc3_man_pages/kill1.html – Vinny
@Vinny signal 9 is SIGKILL ... – NieDzejkob