使用GNU Parallel运行Python脚本时atexit注册函数不触发如何解决
问题原因
GNU Parallel默认收到Ctrl+C触发的SIGINT信号时,会按照预设的终止信号序列处理子进程:先发送可捕获的SIGINT/SIGTERM信号,仅等待极短时间后就直接发送无法捕获的SIGKILL信号强杀进程。Python的atexit注册的回调仅会在进程正常退出、或收到可捕获信号后主动完成退出流程时触发,被SIGKILL强杀时没有机会执行清理逻辑。
解决方法
方法1:临时调整Parallel终止信号序列
执行Parallel命令时添加
--termseq参数,拉长可捕获信号后的等待时长,给Python预留足够的清理执行时间:parallel --termseq INT,5000,TERM,2000,KILL -j 4 ./test_signal.py {} ::: $(seq 1 12)上面的配置含义为:先发送SIGINT信号,等待5000毫秒(5秒),如果进程未退出再发送SIGTERM信号,再等待2000毫秒(2秒),仍未退出才发送SIGKILL强杀,完全覆盖常规Python清理逻辑的执行耗时。
方法2:永久生效配置
将参数写入Parallel用户配置文件
~/.parallel/config,后续所有Parallel命令都会默认使用该终止策略:--termseq INT,5000,TERM,2000,KILL方法3:Python脚本补充信号处理(可选,更稳妥)
Python默认收到SIGTERM信号时会直接强制退出,不会触发
atexit回调,可以在脚本中主动添加SIGTERM信号处理逻辑,确保所有常规终止信号都会触发清理:# 新增代码段,放在脚本开头即可 import signal def handle_term(signum, frame): sys.exit(143) signal.signal(signal.SIGTERM, handle_term)
内容的提问来源于stack exchange,提问作者Axeon Thra
相关产品推荐
相关产品推荐

