问题背景:

在家用ssh连学校服务器经常会莫名其妙地自动断开,所以我常常得不到完成的程序结果。今天师兄告诉我有这个命令,我真的是如获至宝,在我夸赞师兄并表达感谢的时候,师兄说“这不是操作系统的基础知识吗”我“???”一点也不记得了,痛定思痛好好写一下他们的用法,让自己记的更牢固一些。

知识点1:

"&"命令是指在后台运行,但是当用户挂起的时候,命令自动也会跟着退出。如果你在执行一个python文件,那么当你ssh被关了,程序运行也自动结束了。

知识点2:

"nohup"命令是"no hang up"的缩写,注意nohup没有后台运行的功能,但是可以不挂断地运行。即用nohup运行命令可以使命令永久地执行下去,和用户终端没有关系,例如我们ssh断掉都没有关系。

知识点3:

我们可以巧妙地把知识点1和知识点2结合起来,取两者之精华,让程序可以用不挂断地在后台运行。

即nohup COMMAND >/del/null &

举个栗子:

1.python train.py &

将python train.py放到后台运行,关闭xshell(即用户被挂起)时,程序运行自动结束。

2.nohup python train.py

将python train.py用不挂断地执行,但不借助任何后台,终端不接受任何标准输入,重定向标准输出和错误标准到当前目录下的nohup.out文件,及时关闭xshell退出当前session依然能继续运行。

3.nohup python train.py &

表示将python train.py放到后台,但依然可以使用标准输入,终端可以接受任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件。即关闭xshell退出当前session后依然能够运行。

4.>nohup ./start-dishi.sh >output 2>&1 &

知识点补充:

操作系统中有三个常用的流:
  0:标准输入流 stdin
  1:标准输出流 stdout
  2:标准错误流 stderr

  一般当我们用 > console.txt,实际是 1>console.txt的省略用法;< console.txt ,实际是 0 < console.txt的省略用法。

题目解释:
2>&1的意思 是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output里面,所以结果是标准错误和标准输出都导入文件output里面了。 至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。这就会导致 >output 2>output 文件output被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我们想要的. 

  这就是为什么有人会写成: nohup ./command.sh >output 2>output出错的原因了 

最后谈一下/dev/null文件的作用,这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。 所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里>./command.sh >/dev/null 2>&1