当前位置:首页>Linux>代码学习 | Linux | nohup 后台任务管理

代码学习 | Linux | nohup 后台任务管理

  • 2026-10-11 06:17:41
代码学习 | Linux | nohup 后台任务管理

提交分析任务,关掉终端就挂了。用 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(代码已实测可直接运行,建议保存到自己网盘)

最新文章

随机文章