簡體   English   中英

當 python 進程被殺死時運行 atexit()

[英]Run atexit() when python process is killed

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

試試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將被執行。

在 Windows 上調試 PyCharm 時啟用信號:

  1. 在 PyCharm 中Ctrl + Shift + A出“Find Actions...”菜單
  2. 搜索“注冊表”並按回車鍵
  3. 找到關鍵kill.windows.processes.softly並啟用它(你可以開始輸入“kill”,它會搜索關鍵)
  4. 重啟 PyCharm

要檢查您的系統並查看正在調用哪個信號:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM