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

如何为Jupyter Notebook处理GCP抢占式关机并触发特定中断?

嘿,这个问题我刚好处理过——在GCP抢占式VM上用关机脚本触发Jupyter的自定义中断,核心是把GCP的关机通知机制和Jupyter内核的信号捕获逻辑结合起来,我给你一步步拆解实现方案:

先搞懂前提:GCP抢占式VM的关机流程

GCP在回收抢占式VM前,会提前30秒发送ACPI电源事件,同时自动执行你配置的关机脚本。我们要做的就是在这个脚本里,给Jupyter的内核进程发送一个自定义信号,然后在Notebook里提前写好这个信号的处理函数,触发你想要的中断逻辑(比如保存数据、终止任务、记录状态等)。

步骤1:给VM配置关机脚本

你有两种方式设置关机脚本:

  • 创建VM时:在GCP控制台的「管理」标签页,找到「关机脚本」选项,直接输入脚本内容或者选择云存储里的脚本文件。
  • 给已存在的VM添加:用gcloud命令快速修改metadata,比如:
gcloud compute instances set-metadata YOUR_INSTANCE_NAME --metadata shutdown-script='#!/bin/bash
# 后面会填具体的脚本内容'

或者直接在GCP控制台编辑实例的metadata,添加shutdown-script键和对应的脚本值。

步骤2:在Jupyter Notebook里写信号处理逻辑

Jupyter的Python内核支持通过signal模块捕获系统信号,我们可以提前注册一个自定义信号的处理函数,当收到信号时执行我们的中断操作。

举个实用的例子,把这段代码放在Notebook的开头:

import signal
import sys
import pickle
import time

def handle_vm_preemption(signum, frame):
    print("\n⚠️ 收到VM抢占关机通知!正在执行中断处理...")
    # 这里写你的自定义逻辑:比如保存当前变量、关闭数据库连接、清理临时文件
    # 示例:把当前关键变量保存到临时文件
    save_data = {
        "training_loss": current_loss if 'current_loss' in locals() else None,
        "model_state": model.state_dict() if 'model' in locals() else None
    }
    with open('/tmp/preemption_backup.pkl', 'wb') as f:
        pickle.dump(save_data, f)
    print("✅ 中断处理完成,即将退出")
    sys.exit(0)

# 注册SIGUSR1信号的处理函数(这个信号是我们自定义用的,不会和系统默认冲突)
signal.signal(signal.SIGUSR1, handle_vm_preemption)

# 模拟你的长时间运行任务(比如训练模型)
print("任务启动中...")
while True:
    time.sleep(1)
    print("任务运行中...")
步骤3:在关机脚本里给Jupyter进程发信号

接下来要写关机脚本的核心逻辑:找到Jupyter的内核进程,给它发送我们刚才注册的SIGUSR1信号。

完整的关机脚本示例:

#!/bin/bash

# 找到Jupyter的Python内核进程(进程名通常是ipykernel_launcher)
JUPYTER_KERNEL_PID=$(pgrep -f "ipykernel_launcher")

if [ ! -z "$JUPYTER_KERNEL_PID" ]; then
    echo "找到Jupyter内核进程,PID: $JUPYTER_KERNEL_PID,发送SIGUSR1信号"
    kill -USR1 $JUPYTER_KERNEL_PID
    # 留10秒时间让Notebook处理中断逻辑(GCP给的总时间是30秒,别超时)
    sleep 10
fi

# 继续执行系统默认的关机流程
exit 0
几个关键注意事项
  • 信号选择:尽量用SIGUSR1或SIGUSR2这类用户自定义信号,别用SIGTERM或SIGKILL——这些系统信号Jupyter本身有默认处理,可能直接终止进程,来不及执行你的自定义逻辑。
  • 时间控制:GCP只给30秒的关机准备时间,所以你的中断逻辑一定要简洁,别做太耗时的操作(比如大文件上传)。
  • 精准定位进程:如果你的VM上跑了多个Jupyter内核,你可能需要更精准的筛选方式,比如结合Notebook的端口号或者进程的工作目录来定位目标PID。
  • 测试验证:别等真的被抢占才测试!用gcloud compute instances simulate-maintenance-event YOUR_INSTANCE_NAME命令模拟抢占事件,验证你的脚本和Notebook逻辑是否正常工作。

内容的提问来源于stack exchange,提问作者Md. Mushfiqur Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:47:32