linux后台运行任务需组合jobs、&、Ctrl+Z/bg/fg和nohup:jobs查看当前Shell作业;&启动后台,Ctrl+Z暂停后用bg/fg调度;nohup忽略SIGHUP并重定向输出,确保终端断开后持续运行。

Linux中让任务在后台持续运行,关键靠 jobs 查看、nohup 保活、再配合 & 和 Ctrl+Z / bg 灵活调度。不依赖终端、不被SIGHUP中断,才是真后台。
用 jobs 查看和管理当前 Shell 的作业
jobs 只显示当前 Shell 启动的、尚未结束的作业(包括暂停和运行中的),不跨会话、不查系统级进程。
- jobs:列出所有作业,显示编号(如 [1])、状态(Running/Stopped)和命令
- jobs -l:额外显示 PID,方便后续用 kill 操作
- jobs -r:只显示正在运行的作业
- jobs -s:只显示已暂停的作业
注意:关闭终端后,jobs 列表清空;它不等于 ps 或 top,别用来找别人启动的进程。
用 & 和 Ctrl+Z 实现即时后台切换
交互式场景下快速“甩开”任务,靠组合键和符号:
- 命令末尾加 &:直接以后台方式启动,例如 sleep 300 &,立刻返回提示符
- 运行中按 Ctrl+Z:暂停当前前台任务,回到 Shell,此时任务处于 Stopped 状态
- 输入 bg:把最近一个暂停的任务切到后台继续运行
- 输入 bg %2:把作业编号为 2 的暂停任务放到后台运行
- 输入 fg %1:把作业 1 拉回前台(常用于调试或等它结束)
这些操作都只是“Shell 作业控制”,一旦终端关闭,后台任务仍会被 SIGHUP 信号终止——除非你用了 nohup。
用 nohup 让任务彻底脱离终端生命周期
nohup 的核心作用是忽略 SIGHUP 信号,并自动重定向输出(stdout/stderr)到 nohup.out,确保断开 ssh 或关闭终端后进程继续跑。
- nohup command &:最常用写法,例如 nohup python3 server.py &
- nohup command > out.log 2>&1 &:自定义输出文件,把 stdout 和 stderr 都写入 out.log
- nohup command 不加 &:命令会在前台运行,但不怕终端断开;想释放终端,仍需手动加 &
注意:nohup 不等于守护进程,它不处理 PID 文件、不自动重启、不管理子进程。适合一次性长期任务,比如数据处理、临时 API 服务等。
补充技巧:结合 disown 和重定向提升健壮性
如果忘了加 nohup,但任务已在后台运行(比如用了 &),可以补救:
- 先用 jobs 确认作业编号,如 [1]+ Running ./script.sh &
- 执行 disown %1:从当前 Shell 作业表中移除该任务,使其不再受 SIGHUP 影响(效果类似 nohup,但不改输出重定向)
- 若还需保存输出,建议提前用 > log.txt 2>&1 重定向,否则默认输出可能丢失或卡在缓冲区
另外,nohup 默认使用 nohup.out,如果多人共用账号或多个任务,记得用不同输出文件避免覆盖。
基本上就这些。jobs 看得见,& 和 Ctrl+Z 调得快,nohup 守得住——三者配合,Linux 后台任务就能稳稳跑下去。