【实用技巧】终止nohup后台运行程序的完整步骤(附实战案例)
在Linux服务器上,我们常通过nohup命令让程序脱离终端后台运行(比如深度学习训练脚本),但需要终止时却不知道该怎么操作?本文结合实战案例,手把手教你精准终止nohup运行的程序。
一、核心原理
nohup运行的程序本质是Linux后台进程,终止的核心逻辑是:
先找到进程的唯一标识(PID)→ 再通过PID终止进程
二、具体操作步骤(附实战案例)
以我实际运行的train_ae.py脚本为例,全程演示操作流程。
步骤1:查找目标进程的PID
使用ps -ef | grep 程序名命令定位进程,这是最常用的方式:
ps-ef|greptrain_ae.py实战输出解析
我执行上述命令后,得到如下输出:
root 22819 0 99 Jan03 ? 8-20:58:11 python train_ae.py root 31183 30896 0 10:48 pts/10 00:00:00 grep --color=auto train_ae.py先看懂ps -ef输出列的含义(按顺序):
| 列位置 | 含义 | 关键说明 |
|---|---|---|
| 第1列 | UID | 运行进程的用户(示例中为root) |
| 第2列 | PID | 进程ID(终止程序的核心,重点关注) |
| 第3列 | PPID | 父进程ID(后台进程通常为0) |
| 第4列 | %CPU | 进程占用CPU百分比(99%说明脚本高负载运行) |
| 第5列 | STIME | 进程启动时间(Jan03表示1月3日启动) |
| 第6列 | TTY | 关联终端(?表示后台运行,nohup特征) |
| 第7列 | TIME | 累计运行时间(8天20小时,说明长期运行) |
| 第8列 | CMD | 执行的命令(区分目标进程和grep自身) |
关键区分
- 第一行:
python train_ae.py是真正要终止的目标进程,PID为22819; - 第二行:
grep --color=auto train_ae.py是查找命令自身的进程,无需关注,更不要误杀。
步骤2:终止进程(两种方式)
找到PID(22819)后,优先选择「优雅终止」,无效再用「强制终止」。
方式1:优雅终止(推荐)
发送正常终止信号,让程序保存数据、释放资源:
kill22819方式2:强制终止(优雅终止无效时用)
若程序卡死(比如kill后仍在运行),用-9参数强制杀死(注意:可能导致数据丢失):
kill-922819步骤3:验证是否终止成功
再次执行查找命令,若仅剩下grep自身进程(或无输出),说明终止成功:
ps-ef|greptrain_ae.py三、补充技巧(可选)
如果知道程序占用的端口(比如8080),也可以通过端口查PID:
# 查找端口对应的进程lsof-i:8080# 或用netstat(需安装net-tools)netstat-tunlp|grep:8080四、注意事项
- 务必区分「目标进程」和「grep自身进程」,避免误杀其他程序;
- 非必要不使用
kill -9,尤其是涉及数据写入的程序(如训练脚本、数据库程序); - 普通用户只能终止自己的进程,root用户可终止所有进程(谨慎操作)。
五、总结
- 终止nohup后台程序的核心:
查PID(ps -ef | grep 程序名)→ 杀进程(kill/kill -9 PID); - 重点关注
ps -ef输出的第二列(PID),区分目标进程和grep自身进程; - 优先优雅终止,仅在程序无响应时使用强制终止。
发布小提示
- 发布时可在开头加一句场景说明(比如“做深度学习训练时,用nohup跑脚本后需要终止,整理了这套实操流程”);
- 代码块和表格保留,提升阅读体验;
- 可配图(比如截图你的ps -ef输出),更直观。
关键点回顾
- 终止nohup程序的核心是先通过
ps -ef | grep 程序名找到目标进程的PID(如22819); - 区分ps输出中目标进程(python train_ae.py)和grep自身进程,避免误操作;
- 优先用
kill PID优雅终止,无效再用kill -9 PID强制终止,终止后需验证结果。