我有一个在后台运行的python进程,我希望它只在脚本终止时生成一些输出。
def handle_exit():
print('\nAll files saved in ' + directory)
generate_output()
atexit.register(handle_exit)
正确调用KeyboardInterupt
异常和sys.exit()
调用handle_exit()
,但如果我要从终端执行kill {PID}
,则会在不调用handle_exit()的情况下终止脚本。
有没有办法终止在后台运行的进程,并且在终止之前仍然运行handle_exit()
?
答案 0 :(得分:9)
试试signal.signal。它允许捕获任何系统信号:
import signal
def handle_exit():
print('\nAll files saved in ' + directory)
generate_output()
atexit.register(handle_exit)
signal.signal(signal.SIGTERM, handle_exit)
signal.signal(signal.SIGINT, handle_exit)
现在,您可以执行kill {pid}
和handle_exit
。
答案 1 :(得分:1)
在 Windows 上调试 PyCharm 时启用信号:
Ctrl + Shift + A
以显示“Find Actions...”菜单kill.windows.processes.softly
并启用它(您可以开始输入“kill”,它会搜索密钥)答案 2 :(得分:0)
要检查您的系统并查看正在调用哪个信号:
import signal
import time
def handle_signal(sig_id, frame):
sig = {x.value: x for x in signal.valid_signals()}.get(sig_id)
print(f'{sig.name}, {sig_id=}, {frame=}')
exit(-1)
for sig in signal.valid_signals():
print(f'{sig.value}: signal.{sig.name},')
signal.signal(sig, handle_signal)
time.sleep(30)