nohup

Nohup是No hangups的简称,它加在别的命令的前面,告诉linux系统不要将这个命令停止运行——它就像一个辅助工具。被修饰的命令会一直运行到结束。它的使用语法非常简单,像下面这样:

nohup sh your-script.sh &

nohup.out

因为它可以在后台运行(当前用户看不到它的实时执行结果),所以它需要输出一些结果或者错误消息到日志中,方便你查看——这个日志叫做nohup.out。默认情况下,这个文件存在于执行命令时所在目录

nohup.out是不指定目录时默认的位置。也可以指定一个路径:

nohup sh your-script.sh > /path/to/custom.out &

Nohup Custom Output

nohup命令经常和2>&1一起使用,例如:

nohup ./backup.sh > backup.log 2>&1 &

这是I/O重定向的语法。

I/O重定向(redirection)

重定向就是将一条命令的输出重定向到其他位置,例如,我们使用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,因为我们重定向的是标准输出,而不是标准错误

文件描述符(file descriptors)

文件描述符是用整数来表示一个打开的文件,如果你有100个打开的文件,你就有100个文件供述符。对于标准输出(stdout)和标准错误(stderr),都有对应的文件供述符。1代表stdout2代表stderr

两者结合

回到第一个例子,当我们将输出重定向到output.txt,我们可以这样:

$ cat foo.txt 1> output.txt

这个1stdout的文件描述符,重定向的语法是[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相同的位置”。即将stdoutstderr重定向到一个地方:

$ 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