nohup介绍


声明:本文转载自https://my.oschina.net/styshoo/blog/1529011,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

背景

  我们通常使用&将前台任务变为后台任务执行,但是如果只是使用&,那么在突然断网或者关闭启动该任务的终端(ps:可使用putty来测试,部分软件如mobaxterm做了优化,关闭终端是友好关闭的)时,内核就会给后台任务发送SIGHUP信号,从而导致后台任务停止。这时,我们就需要使用nohup来启动该后台任务。

简介

  nohup,顾名思义,就是使得运行的命令可以忽略HANGUP信号。因此,即使突然断网或者关闭终端,该后台任务依然可以继续执行。
  这里需要指明的是,nohup并不会自动将任务运行在后台,我们需要在命令行末尾加上&来显示的指明。

进阶

  如果nohup命令的标准输入是终端,那么nohup将会默认使用/dev/null来重定向。   如果nohup命令的标准输出是终端,那么标准输出会被附加到文件nohup.out中;如果用户没有在当前目录创建文件的权限,那么就会把输出附加到$HOME/nohup.out中;如果还是没有写入权限,那么该命令就不会执行。
  如果nohup命令的标准错误是终端,那么就会被定向到标准输出的附加的文件描述符。如果标准输出被关闭了,那么标准错误就会像上面一样尝试附加到nohup.out$HOME/nohup.out中。

测试

  这里,我们先创建一个需要较长时间来执行的脚本。该脚本会打印一个数字(标准输出),删除一个不存在的文件(标准错误输出)。

$ vi test.sh for i in `seq 1 20`; do echo $i; rm a.txt; sleep 1; done 

默认参数

  我们来后台执行该文件。

$ nohup sh test.sh & [1] 9119 $ nohup: ignoring input and appending output to 'nohup.out' 

  在上面执行的命令中,由输出nohup: ignoring input and appending output to 'nohup.out'可知,标准输出被重定向到nohup.out中,我们查看下该文件。

$ head nohup.out 1 rm: cannot remove 'a.txt': No such file or directory 2 rm: cannot remove 'a.txt': No such file or directory 3 rm: cannot remove 'a.txt': No such file or directory 4 rm: cannot remove 'a.txt': No such file or directory 5 rm: cannot remove 'a.txt': No such file or directory ... 

  该文件包含了命令的标准输出和标准错误输出。

重定向标准输出

$ nohup sh test.sh 1>o.out & [1] 9378 $ nohup: ignoring input and redirecting stderr to stdout 

  在上面执行的命令中,可知,标准输出被重定向到stdout中,而标准输出又重定向到了o.out中,我们查看下该文件。

$ head o.out 1 rm: cannot remove 'a.txt': No such file or directory 2 rm: cannot remove 'a.txt': No such file or directory 3 rm: cannot remove 'a.txt': No such file or directory 4 rm: cannot remove 'a.txt': No such file or directory 5 rm: cannot remove 'a.txt': No such file or directory ... 

  该文件包含了标准输出和标准错误输出的。

重定向标准输出标准错误输出

$ nohup sh test.sh 1>o.out 2>e.out & [1] 9490 

  这一次,终端没有其他输出。我们直接查看命令行中的两个文件。

$ head o.out 1 2 3 4 5 6 7 8 9 10  $ head e.out nohup: ignoring input rm: cannot remove 'a.txt': No such file or directory rm: cannot remove 'a.txt': No such file or directory rm: cannot remove 'a.txt': No such file or directory rm: cannot remove 'a.txt': No such file or directory rm: cannot remove 'a.txt': No such file or directory rm: cannot remove 'a.txt': No such file or directory rm: cannot remove 'a.txt': No such file or directory rm: cannot remove 'a.txt': No such file or directory rm: cannot remove 'a.txt': No such file or directory 

shell脚本中执行nohup的问题

  如果我们在shell中执行nohup命令,并且没有进行任何重定向,那么终端上就会弹出“nohup: ignoring input and appending output to 'nohup.out'”,并且,只有敲击回车,shell才能继续执行,否则就会卡住。
  经过试验,发现只要重定向了标准错误输出,终端就不会弹出任何提示,也不会卡住。但是标准错误附加的文件会出现其他的错误提示,只有重定向所有标准输入、标准输出和标准错误输出后,不会有任何错误提示。如:

$ nohup sh test.sh >out.log 2>&1 </dev/null & 

参考

http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html http://www.cnblogs.com/lovemo1314/archive/2011/07/13/2105472.html http://www.gnu.org/software/coreutils/manual/html_node/nohup-invocation.html#nohup-invocation https://stackoverflow.com/questions/24646320/nohupignoring-input-and-appending-output-to-nohup-out

本文发表于2017年09月05日 10:36
(c)注:本文转载自https://my.oschina.net/styshoo/blog/1529011,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2253 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1