【kill】在容器中使用 nohup 启动 Python 训练脚本后,如何正确停止进程?

📅 发布时间:2026/7/11 16:15:38 👁️ 浏览次数:
【kill】在容器中使用 nohup 启动 Python 训练脚本后,如何正确停止进程?
​ 在服务器或 Docker 容器中跑深度学习训练时nohup几乎是标配操作可以参考之前写的文章【在容器中运行长时间 Python 任务SSH 断开也不怕】nohuppython scripts/frozen_backbone_train.pylogs/frozen_finetune.log21​ 但问题也随之而来这个后台跑起来的 Python 进程到底该怎么安全、彻底地停掉​ 本文结合一次PyTorch 训练 DataLoader 多进程的真实排查过程完整记录正确的 kill 思路。一、先找到真实在跑的进程​ 第一步永远不是kill -9而是确认进程结构psaux|grephomo_with_vit_frozen.py​ 可能会看到类似输出root1652... python frozen_backbone_train.py root2424... python frozen_backbone_train.py root2425... python frozen_backbone_train.py root2426... python frozen_backbone_train.py...​ 这时候很多人会懵为什么同一个脚本会有一堆 Python 进程二、为什么会有多个 python 进程​ 这是PyTorch 非常典型的行为。2.1 主进程训练主逻辑root1652... python frozen_backbone_train.py负责模型 forward / backward / optimizer.step通常运行时间很长CPU / GPU 占用明显这是你真正要 kill 的进程2.2 子进程DataLoader workersroot2424~2431... python frozen_backbone_train.py​ 这些通常是DataLoader(..., num_workers 0)拉起的数据加载子进程特征非常明显一次性出现一串PID 连号CPU 占用相近内存结构几乎一样结论多进程 ≠ 多个训练任务而是一个训练任务 多个数据加载 worker三、正确的 kill 姿势推荐3.1 方式一只 kill 主进程最干净kill1652大多数情况下主进程退出所有 DataLoader 子进程会被自动回收如果进程没有立刻退出kill-916523.2 方式二直接按脚本名全部清场当你确认这个脚本已经不需要了可以直接pkill-9 -f frozen_backbone_train.py-f匹配完整命令行会同时 kill 主进程 所有子进程注意如果你同时跑了多个同名脚本这一招会“一锅端”。四、如何确认真的 kill 干净了4.1 再查一次进程psaux|grepfrozen_backbone_train.py如果只剩下grep--colorauto frozen_backbone_train.py说明进程已经全部退出4.2 如果使用 GPU确认显存释放nvidia-smi没有 python 占用显存 → OK有残留 → 继续kill -9 pid五、小结nohup启动的 Python 进程 ≠ 只有一个进程PyTorch 的DataLoader(num_workers 0)会产生多个子进程正确做法是优先 kill 主进程或使用pkill -f一次性清理养成记录 PID 的习惯可以极大降低维护成本