如何优雅终止Jupyter内核B并阻止内核自动重启?
解决方案
方向一:让内核B优雅退出,完整保存审计数据
通过信号触发优雅退出
不要直接杀死内核A,先记录内核B和strace的PID(启动时用subprocess.Popen保存proc.pid),之后发送SIGTERM信号(信号编号15)让内核B先完成审计数据写入再退出:import os # 发送SIGTERM给内核B os.kill(b_pid, 15) # 发送SIGUSR1给strace,停止追踪并确保数据写入 os.kill(strace_pid, 10)同时要在内核B的代码中添加信号处理逻辑,捕获SIGTERM后先刷写strace日志到磁盘,再终止自身。
单独控制strace的追踪状态
strace支持用SIGUSR1信号停止追踪但不终止目标进程,完成数据写入后再正常关闭内核B,避免强制终止带来的数据丢失:import time # 停止strace追踪 os.kill(strace_pid, 10) # 等待数据写入完成 time.sleep(1) # 优雅关闭内核B os.kill(b_pid, 15)
方向二:阻止Jupyter自动重启内核A
修改内核配置文件
找到内核A的kernel.json(路径通常为~/.local/share/jupyter/kernels/[内核A名称]/kernel.json),添加"restart": false配置,禁用自动重启:{ "argv": ["python", "-m", "kernelA", "-f", "{connection_file}"], "display_name": "Kernel A", "language": "python", "restart": false }让内核A主动正常退出
避免使用os.kill(os.getpid(), 9)(SIGKILL强制终止会触发Jupyter重启),而是先终止内核B和strace,再让内核A主动调用sys.exit()正常退出:import sys import time # 先停止strace并关闭内核B os.kill(strace_pid, 10) time.sleep(1) os.kill(b_pid, 15) # 内核A主动退出 sys.exit(0)Jupyter对正常退出(返回码0)的内核不会触发自动重启。
其他思路
- 分离审计逻辑与内核进程
将审计功能从内核A中剥离,单独启动一个独立的监控进程负责启动内核B、执行strace追踪、保存审计数据。内核A仅负责与Jupyter交互并向监控进程发送控制指令,这样即使内核A退出,监控进程也能独立完成数据保存,不受Jupyter重启机制影响。
内容的提问来源于stack exchange,提问作者SRA
相关产品推荐
相关产品推荐

