&

在终端执行命令,如果想让命令在后台执行,不占用终端窗口,可以在该命令后面加上&&可以把这个命令转换为后台运行的任务进程:

1
command &

不过,虽然进程在后台运行了,但进程运行中输出的日志一样会打印到终端窗口上。如果不想终端窗口产生大量输出,我们可以将这些输出重定向到某个文件中:

1
command > out.file 2>&1 &

这样,所有的标准输出和错误输出都将被重定向到out.file文件中。

使用&将命令转换为后台运行的任务进程时有两点需要了解下:

1. 命令转换为后台任务进程执行时,会返回该进程的 ID。有了 ID 我们就能对该进程进行操作了,如:结束进程。
2. 一旦执行该命令的终端窗口关闭了,后台运行的任务进程也会随之停止。换句话说,执行该命令的终端窗口不能关闭,除非你不想让后台任务进程继续运行了。

nohup

在前面介绍&的使用时我们知道,一旦运行&命令的终端窗口关闭了,后台运行的任务进程也会随之停止。这显然不是我们想要的,这时nohup就派上用场了。nohup命令可以使终端窗口关闭后,后台任务进程继续运行。nohupno hang up的缩写,意思是不挂起。常与&一同使用,该命令的一般形式为:

1
nohup command &

执行完上面命令后,会在当前目录下生成一个名为nohup.out的文件,后台进程的所有输出都被重定向到该文件下。如果当前目录下的nohup.out文件不可写(用户没有写权限),则输出重定向到$HOME/nohup.out文件中,如果$HOME/nohup.out文件也不可写,则nohup命令会执行失败。

当然,我们也可以自定义输出重定向:

1
nohup command > out.file 2>&1 &

不是所有命令都适合在后台运行

不是所有命令都适合在后台运行,比如:需要用户交互的命令不要放在后台执行。因为程序在后台运行,用户并不知道需要输入,程序执行到需要用户交互的地方时就会一直傻等在那里。