You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在被kill命令终止时让Python脚本退出前执行优雅清理函数?

当然可以实现!你需要利用Python的信号处理机制来捕获kill命令发送的终止信号,触发自定义的清理逻辑。下面是具体的实现方案:

核心思路

kill PID默认发送的是SIGTERM信号(可以被程序捕获并处理),我们可以在脚本中注册这个信号的处理函数,让它调用你的exit_gracefully完成清理工作后再退出。

完整实现代码
import signal
import sys
from selenium import webdriver

# 全局变量存储浏览器实例,方便清理函数调用
driver = None
# 示例:如果有打开的中间文件对象,也可以在这里声明
# intermediate_file = None

def exit_gracefully():
    """自定义清理函数"""
    global driver
    # 优雅终止Chrome和chromedriver(比手动kill进程更可靠)
    if driver:
        driver.quit()
        print("已关闭Chrome浏览器进程")
    
    # 处理中间文件:刷新缓冲区并关闭
    # if intermediate_file:
    #     intermediate_file.flush()
    #     intermediate_file.close()
    #     print("已刷新并关闭中间文件")
    
    print("所有清理操作完成,脚本退出")

def handle_termination_signal(signum, frame):
    """信号处理函数:收到终止信号时触发"""
    print(f"\n收到终止信号(信号编号:{signum}),开始执行清理...")
    exit_gracefully()
    sys.exit(0)

def main():
    global driver
    # 注册信号处理:捕获SIGTERM(kill默认信号)和SIGINT(Ctrl+C)
    signal.signal(signal.SIGTERM, handle_termination_signal)
    signal.signal(signal.SIGINT, handle_termination_signal)
    
    # 初始化无头Chrome浏览器
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless=new')
    driver = webdriver.Chrome(options=chrome_options)
    
    # 示例:打开中间文件(如果有需要)
    # intermediate_file = open("temp_data.txt", "a")
    
    # 你的主业务逻辑(比如循环执行任务)
    try:
        while True:
            # 这里写你的核心代码:爬取数据、写入文件等
            pass
    except Exception as e:
        print(f"脚本运行出错:{str(e)}")
        exit_gracefully()
        sys.exit(1)

if __name__ == "__main__":
    main()
关键注意事项
  • 不要使用kill -9 PID:SIGKILL信号无法被程序捕获,会直接强制终止脚本,导致清理逻辑无法执行。
  • 全局变量的使用:确保清理函数能访问到需要处理的资源(比如浏览器实例、文件对象),如果是多线程环境,要注意线程安全。
  • 异常处理:在主逻辑中加入try-except,确保运行时出错也能触发清理操作。

内容的提问来源于stack exchange,提问作者Saurav Pathak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:27:40