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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:50:38