Nohup是No hangups
的简称,它加在别的命令的前面,告诉linux系统不要将这个命令停止运行——它就像一个辅助工具。被修饰的命令会一直运行到结束。它的使用语法非常简单,像下面这样:
nohup sh your-script.sh &
因为它可以在后台运行(当前用户看不到它的实时执行结果),所以它需要输出一些结果或者错误消息到日志中,方便你查看——这个日志叫做nohup.out
。默认情况下,这个文件存在于执行命令时所在目录。
nohup.out
是不指定目录时默认的位置。也可以指定一个路径:
nohup sh your-script.sh > /path/to/custom.out &
nohup命令经常和2>&1
一起使用,例如:
nohup ./backup.sh > backup.log 2>&1 &
这是I/O重定向的语法。
重定向
就是将一条命令的输出重定向到其他位置,例如,我们使用cat来查看一下文件,它的输出被打印到屏幕上:
$ cat foo.txt
foo
bar
baz
我们可以将这个输出重定向
到其他地方,例如output.txt
:
$ cat foo.txt > output.txt
$ cat output.txt
foo
bar
baz
第一条cat
命令执行完后,我们没有在屏幕上看到输出,因为我们将标准输出(stdout
)重定向到一个文件里,它不再输出到默认的屏幕。
除了标准输出外,还有一个位置叫叫标准错误(stderr
),程序可以将错误信息输出到这里,例如,我们访问一个不存在的文件:
$ cat nop.txt > output.txt
cat: nop.txt: No such file or directory
即使我们将stdout
重定向到一个文件中,我们依然看到了屏幕中出现了这行错误提示cat: nop.txt: No such file or directory
,因为我们重定向的是标准输出
,而不是标准错误
。
文件描述符是用整数来表示一个打开的文件,如果你有100个打开的文件,你就有100个文件供述符。对于标准输出(stdout
)和标准错误(stderr
),都有对应的文件供述符。1
代表stdout
,2
代表stderr
。
回到第一个例子,当我们将输出重定向到output.txt
,我们可以这样:
$ cat foo.txt 1> output.txt
这个1
是stdout
的文件描述符,重定向的语法是[FILE_DESCRIPTOR]>
。
所以,为了重定向stderr
,需要加上对应文件描述符:
# Using stderr file descriptor (2) to redirect the errors to a file
$ cat nop.txt 2> error.txt
$ cat error.txt
cat: nop.txt: No such file or directory
到现在,你可能已经知道2>&1
究竟是在干蛤了。
使用&1
代表stdout
的值,所以2>&1
是“将stderr
重定向到和stdout
相同的位置”。即将stdout
和stderr
重定向到一个地方:
$ cat foo.txt > output.txt 2>&1
$ cat output.txt
foo
bar
baz
$ cat nop.txt > output.txt 2>&1
$ cat output.txt
cat: nop.txt: No such file or directory