人人都会AI编程

nohup、&、jobs、fg、bg:后台运行与任务管理

更新时间:2026-07-12

在 Linux 终端中,一个命令默认会占用当前终端的前台,直到它执行完毕,期间你无法输入其他命令。但现实工作里,我们常常需要让任务在后台静默运行(如长时间的数据备份、启动 Web 服务),或者临时冻结一个前台任务让它转到后台。Linux 提供了一套轻巧的命令来管理这些需求,核心工具就是 &nohupjobsfgbg

1. & —— 直接把任务放入后台
在命令末尾加上 &,该命令就会在后台运行,终端立即返还提示符,你可以继续做其他事情。

python train_model.py &

运行后会显示 [1] 3421,其中方括号中的数字是该任务的 job number,后面的数字是 PID(进程 ID)。此时该任务虽然已在后台,但它仍然属于当前终端会话的子进程——如果关掉终端,它也会被终止。对于能在几分钟内完成的临时任务,& 是最快捷的办法。

2. nohup —— 让任务脱离终端
nohup(no hang up)的作用是让一个命令忽略 SIGHUP 信号。当你退出终端或者关闭 SSH 连接时,系统会向该终端的所有子进程发送 SIGHUP,默认会终止它们。nohup 可以让命令免疫这一信号,从而在你登出后继续运行。

nohup long_compilation.sh &

默认情况下,命令的输出会被重定向到当前目录下的 nohup.out 文件中(除非自行重定向)。注意 nohup 阻止的是终端关闭导致的挂断信号,但并不能使任务变成“守护进程”,它依然占用当前终端的部分资源(如标准输入/输出)。因此,通常需要同时用 & 放到后台,或者配合 disown 进一步移除任务与终端的关联。

3. jobs —— 查看当前会话的后台任务
jobs 命令可以列出当前终端会话中所有处于后台的任务,包括暂停的和正在运行的,以及它们的任务编号和状态(Running, Stopped)。

$ jobs
[1]-  Running   python train.py &
[2]+  Stopped   vim article.md

“+”表示最近一次被操作的任务,“-”表示次最近的任务。这两个符号在后续的 fgbg 命令中可以用来快速引用任务,如 fg %1bg %2 或者直接 fg %+ / fg %-

4. fgbg —— 任务的前后台切换

  • fg(foreground):将一个后台或暂停的任务调回到前台运行。如果你想继续编辑一个之前被暂停的 vim 文件,可以执行:
  fg %2     # 将 2 号任务拉回前台
  

或者只输入 fg,默认会操作最近的一个任务。

  • bg(background):让一个已经暂停的任务在后台继续运行。当你在前台用 Ctrl+Z 暂停了一个任务(比如正在跑的 top),就可以用 bg 让它转到后台运行,释放终端。
  bg %1
  

配合 Ctrl+Z(暂停前台任务)和 bg,可以在不预知任务将变为长时间运行的情景下,临时将其转为后台,继续执行。

实用技巧与常见陷阱

  • 当你已经启动一个前台任务,却忘记加 & 时,可以按 Ctrl+Z 暂停它,然后输入 bg,它就转入后台了继续运行。这避免了重复启动和丢失当前进度。
  • nohup& 联合使用是远程 SSH 会话中最经典的组合:nohup some_long_task &。但更好的替代方案是使用终端复用器(如 tmuxscreen),它们提供了更完整的会话保留和管理能力。
  • jobs 只显示当前终端会话的任务。如果你打开多个终端窗口或者 SSH 会话,各自的后台任务是独立的,jobs 看不到另一个终端里的任务。
  • 如果希望后台任务在终端关闭后仍然存在,并且希望后续还能重新接上查看状态,建议直接使用 tmuxscreen,它们比 nohup 更灵活。

这几个命令的组合虽然简单,却是命令行工作流中每日都会用到的“时间管理”工具。掌握它们,你就不会再因为要等一个长时间任务结束而发呆,也不会因为误关终端而让工作成果丢失。