通常,我们在终端使用命令时,若在其后添加 & 会使程序在后台运行。那么这个所谓的在后台运行是什么意思呢?

这里其实要提到 Linux jobs 的概念,在 shell 中执行的每条命令都可以认为都是 job,这些 job 基本都是前台 job,若有的命令执行时间比较长,那么我们可以把它放到后台,使之成为后台 job,这样我们可以继续在终端中进行工作。& 的作用就是使进程成为后台 job

除了 &,对于已经在运行的前台 job,还可使用 Ctrl + Z 使之成为后台 job。

这也是为什么要使用 jobs -l ,查看后台 job。

如果从信号的角度理解,我们也可以认为 & 使程序免疫了 SIGINT 信号(Ctrl + C)。逃得了 SIGINT 不一定逃得了 SIGHUP,终端会话关闭时,会发送 SIGHUP 信号来结束进程。因此经常会看到 &nohup 连用,使进程同时免疫 SIGINTSIGHUP 信号,这样当终端退出后,该进程会交给1号进程接管,实现真正的后台运行

一个 jobs 的小例子

[test@test-server ~]$ watch -n 1 echo "hello world" &
[1] 13298
[test@test-server ~]$ jobs -l
[1]+ 13298 Stopped (tty output)    watch -n 1 echo "hello world"
[test@test-server ~]$ bg %1
[1]+ watch -n 1 echo "hello world" &
[test@test-server ~]$ jobs -l
[1]+ 13298 Stopped (tty output)    watch -n 1 echo "hello world"
[test@test-server ~]$ fg %1

没有太多技术含量,就是命令老忘,所以简单写了写。