使用 nohup 和 & 让命令在后台执行
&
在终端执行命令,如果想让命令在后台执行,不占用终端窗口,可以在该命令后面加上&。&可以把这个命令转换为后台运行的任务进程:
1 | command & |
不过,虽然进程在后台运行了,但进程运行中输出的日志一样会打印到终端窗口上。如果不想终端窗口产生大量输出,我们可以将这些输出重定向到某个文件中:
1 | command > out.file 2>&1 & |
这样,所有的标准输出和错误输出都将被重定向到out.file文件中。
使用&将命令转换为后台运行的任务进程时有两点需要了解下:
1. 命令转换为后台任务进程执行时,会返回该进程的 ID。有了 ID 我们就能对该进程进行操作了,如:结束进程。
2. 一旦执行该命令的终端窗口关闭了,后台运行的任务进程也会随之停止。换句话说,执行该命令的终端窗口不能关闭,除非你不想让后台任务进程继续运行了。
nohup
在前面介绍&的使用时我们知道,一旦运行&命令的终端窗口关闭了,后台运行的任务进程也会随之停止。这显然不是我们想要的,这时nohup就派上用场了。nohup命令可以使终端窗口关闭后,后台任务进程继续运行。nohup是no hang up的缩写,意思是不挂起。常与&一同使用,该命令的一般形式为:
1 | nohup command & |
执行完上面命令后,会在当前目录下生成一个名为nohup.out的文件,后台进程的所有输出都被重定向到该文件下。如果当前目录下的nohup.out文件不可写(用户没有写权限),则输出重定向到$HOME/nohup.out文件中,如果$HOME/nohup.out文件也不可写,则nohup命令会执行失败。
当然,我们也可以自定义输出重定向:
1 | nohup command > out.file 2>&1 & |
不是所有命令都适合在后台运行
不是所有命令都适合在后台运行,比如:需要用户交互的命令不要放在后台执行。因为程序在后台运行,用户并不知道需要输入,程序执行到需要用户交互的地方时就会一直傻等在那里。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Wpz's Blog!