当python进程被杀死时运行atexit()

时间:2016-11-29 13:00:51

标签: python background-process atexit

我有一个在后台运行的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()

3 个答案:

答案 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 时启用信号:

  1. 在 PyCharm 中点击 Ctrl + Shift + A 以显示“Find Actions...”菜单
  2. 搜索“注册表”并按回车键
  3. 找到密钥 kill.windows.processes.softly 并启用它(您可以开始输入“kill”,它会搜索密钥)
  4. 重启 PyCharm

答案 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)