在 Linux 终端中,一个命令默认会占用当前终端的前台,直到它执行完毕,期间你无法输入其他命令。但现实工作里,我们常常需要让任务在后台静默运行(如长时间的数据备份、启动 Web 服务),或者临时冻结一个前台任务让它转到后台。Linux 提供了一套轻巧的命令来管理这些需求,核心工具就是 &、nohup、jobs、fg 和 bg。
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
“+”表示最近一次被操作的任务,“-”表示次最近的任务。这两个符号在后续的 fg、bg 命令中可以用来快速引用任务,如 fg %1、bg %2 或者直接 fg %+ / fg %-。
4. fg 与 bg —— 任务的前后台切换
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 &。但更好的替代方案是使用终端复用器(如tmux、screen),它们提供了更完整的会话保留和管理能力。jobs只显示当前终端会话的任务。如果你打开多个终端窗口或者 SSH 会话,各自的后台任务是独立的,jobs看不到另一个终端里的任务。- 如果希望后台任务在终端关闭后仍然存在,并且希望后续还能重新接上查看状态,建议直接使用
tmux或screen,它们比nohup更灵活。
这几个命令的组合虽然简单,却是命令行工作流中每日都会用到的“时间管理”工具。掌握它们,你就不会再因为要等一个长时间任务结束而发呆,也不会因为误关终端而让工作成果丢失。