提交分析任务,关掉终端就挂了。用 nohup 挂后台,但忘了 PID、不知道跑没跑完、日志不知存哪——这是刚上服务器时必踩的坑。nohup 搭配 &、jobs、kill、wait,组成了 Linux 后台任务管理的基础工具链,学会它,放心关终端,回来再看结果。这一讲把 nohup、后台 &、jobs、kill、wait、disown 这套组合理清,配可直接运行的示例。
概念速览
nohup 让命令忽略 SIGHUP 信号(终端关闭时发出),配合 & 放后台后,关终端不影响进程。记住 nohup cmd > my.log 2>&1 &,输出定向到自己的日志文件,比默认的 nohup.out 好管理。
核心命令速查
下面按功能分组,复制即可用;有副作用的命令(如 --delete、conda install)放最后一章:
#!/bin/bash# nohup / 后台任务速查 -- 放心关终端、任务继续跑LOG=/tmp/l12_demo.log# ---- nohup 基础 ----nohupsleep 10 > $LOG 2>&1 &PID=$!echo"后台 PID=$PID"cat /proc/$PID/status 2>/dev/null | grep "^Name" || echo"进程已启动"# ---- jobs 查看后台 ----sleep 30 &P2=$!sleep 30 &P3=$!jobs -l# ---- kill 终止 ----kill$P2 2>/dev/null || truekill -9 $P3 2>/dev/null || truekill$PID 2>/dev/null || truewait 2>/dev/null || true# ---- nohup 写日志 ----nohup bash -c 'for i in 1 2 3; do echo "step $i $(date +%T)"; sleep 0.1; done' \ > $LOG 2>&1 &PID2=$!wait$PID2cat$LOG# ---- 进程状态检查 ----pgrep sleep | head -3 || trueps aux | grep "nohup" | grep -v grep | head -3 || true# ---- kill 信号说明 ----# kill PID # SIGTERM 优雅停止(默认)# kill -9 PID # SIGKILL 强制停止(立即)# kill -HUP PID # SIGHUP 重新加载配置# ---- disown 脱钩(关终端后继续运行)----sleep 100 &DBGPID=$!disown$DBGPIDkill$DBGPID 2>/dev/null || true# ---- wait 等待所有后台 ----sleep 0.1 &sleep 0.1 &waitecho"全部后台任务结束"# ---- 查看后台日志实时 ----# tail -f $LOG # 实时追踪日志(Ctrl+C 退出)rm -f $LOGecho"nohup/后台任务演示完成"
示例的输出日志
用测试数据实跑一遍,输出如下(路径已脱敏):
后台 PID=147587Name: sleep[1] 147587 运行中 nohup sleep 10 > $LOG 2>&1 &[2]- 147594 运行中 sleep 30 &[3]+ 147595 运行中 sleep 30 &step 1 14:23:13step 2 14:23:13step 3 14:23:13li 147572 0.0 0.0 13808 4496 ? S 14:23 0:00 bash nohup_jobs.sh全部后台任务结束nohup/后台任务演示完成OKnohup_jobs.sh: 第 23 行: 147595 已杀死 sleep 30
以上为真实终端输出,可直接对照验证命令效果。
避坑指南
nohup.out 磁盘满 → 显式重定向到 /dev/null 或专用日志文件jobs 看不到进程 → jobs 只看当前 shell 的后台,换了 shell 就不见了kill PID 无反应 → 试 kill -9 PID,但会丢未写完的数据- 脚本结束子进程还在 → 用
wait 等待或用 trap 'kill 0' EXIT 清理
📦 完整代码 + 测试数据下载
百度网盘链接:https://pan.baidu.com/s/1noz_4zSEItyTRkvLrQuT2A?pwd=l12c
提取码:l12c(代码已实测可直接运行,建议保存到自己网盘)