Ubuntu终端关闭检测:Python信号处理器部署及无循环场景实现
Python中SIGHUP信号处理函数的正确放置位置
核心结论
必须把signal.signal(signal.SIGHUP, signal_handler)放在**main()函数执行前的程序初始化阶段**,确保信号处理逻辑在主任务运行前就完成注册,这样才能在main()执行过程中捕获到终端关闭发送的SIGHUP信号。
完整示例代码
import signal import time import logging # 提前配置日志,确保信号处理时日志可用 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[logging.FileHandler('signal_log.log'), logging.StreamHandler()] ) def signal_handler(signum, frame): # 自定义SIGHUP处理逻辑 logging.info("捕获到SIGHUP信号!终端已关闭,执行清理操作...") # 可添加资源释放、状态保存等操作 exit(0) # 关键步骤:在main启动前注册信号处理函数 signal.signal(signal.SIGHUP, signal_handler) def main(): logging.info("主函数开始执行") # 模拟15秒的耗时任务 for sec in range(15): time.sleep(1) logging.info(f"任务执行中:第{sec+1}秒") logging.info("主函数执行完成") if __name__ == "__main__": main()
关键细节说明
- 注册时机的必要性:如果把信号注册放在
main()内部,虽然开头位置也能生效,但提前到全局初始化阶段能避免主函数启动初期的信号遗漏风险,确保全程覆盖。 - 无需signal.pause()的原因:
main()本身包含10-20秒的耗时操作,程序处于持续运行状态,操作系统会自动将SIGHUP信号递送到进程,不需要额外调用pause()等待信号。 - 日志配置注意:日志必须在信号处理函数注册前完成配置,否则触发信号时可能因日志未初始化导致无法正常记录。
- Ubuntu终端的信号行为:关闭终端窗口时,终端进程会向前台进程组发送SIGHUP信号,只要你的Python程序是该进程组的前台进程,就能成功捕获信号。
内容的提问来源于stack exchange,提问作者Adarsh Udupi
相关产品推荐
相关产品推荐

