如何在被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
相关产品推荐
相关产品推荐

