Nohup

nohup 是一个 POSIX 命令,用于忽略 SIGHUP ("signal hang up" 译:挂断信号) 。 SIGHUP信号是终端注销时所发送至程序的一个信号。

nohup命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到终端上。

实例

下例中,nohup用于忽略SIGHUP信号,&使命令于后台执行,因此终端退出后命令仍旧执行。

$ nohup 命令名 &

值得注意,这种方法防止命令在注销时被忽略SIGHUP信号,但,如果该命令对 标准I/O文件(stdin,stdout,或stderr)进行输入/输出,那么该命令仍旧可能被终端挂起。[1] 详情请看下文的 阻止挂起 。 另外,nohup 命令常常和nice命令一起执行,以调整命令/程序的优先级。

$ nohup nice 命令 &

相关命令

一些shell(如 Bash)提供一个 shell builtin ,可用于防止发送 SIGHUP 而影响现有的jobs,即使没使用 nohup命令。

disown

在Bash,可以通过disown -h job名忽略 SIGHUP 信号;disown命令将移除job表中特定的job,这也意味着该job不再接受任何信号。[2][3]

Control-Z

通过 Control+Z 可以将当前进程挂起(放置后台并暂停运行),可通过 fg 命令恢复至前台,也通过bg将挂起的进程后台运行。

shopt

shopt huponexit命令让Bash在登录用的shell退出时,发送SIGHUP信号至所有的jobs。[4]

需注意的是,在使用 AIXSolaris 系统的nohup必须添加 p 选项。不同于上述bash内置命令disownnohup -p 使用的是进程ID。[5]

阻止挂断

注意,即便远程SSH会话注销或断开时,已经nohup且在后台job可以避免被中止。

另一个常见的问题是,SSH会话常常拒绝注销(或者挂起),因为它不愿意去丢失与后台job(s)进行交互的数据。[6][7] 该问题可通过 重定向 三次I/O流解决:待考证

$ nohup ./myprogram > foo.out 2> foo.err < /dev/null &

同时需要注意,关闭SSH会话不意味着会发送SIGHUP信号至对应程序。 除此以外,还取决于 伪终端 是否被分配。[8]

替代品

  • 一个 终端复用器(terminal multiplexer ) 可以执行命令于一个单独的会话,该会话是分离当前的终端的,这意味着如果当前终端结束后,分离的会话以及其关联程序仍保持运行。 之后,一个新的终端可以和该会话连接。[9]
例如,下例调用了 screen 将会运行"somescript.sh"于后台的一个独立的会话中:
$ screen -A -m -d -S somename ./somescript.sh &
  • disown 的命令是用于清除job表中的jobs,或者标记jobs,以便在会话结束时不发送SIGHUP信号至标记了的jobs。

参考文献

  1. . Zsh.org. 2005-02-07 [2009-06-10]. (原始内容存档于2009-05-18).
  2. . (原始内容存档于2020-05-18).
  3. . linux.die.net. [2020-01-10]. (原始内容存档于2019-12-27).
  4. . (原始内容存档于2019-12-26).
  5. IBM Knowledge Center 页面存档备份,存于. 01.ibm.com (2015-03-26). Retrieved on 2015-04-13.
  6. . Snailbook.com. [2009-06-10]. (原始内容存档于2009-01-22).
  7. . Openssh.com. 2005-09-20 [2009-06-10]. (原始内容存档于2009-07-10).
  8. . Bugzilla.mindrot.org. [2009-06-10]. (原始内容存档于2009-09-13).
  9. . www.ibm.com. 2008-05-29 [2020-01-14]. (原始内容存档于2020-01-14) (中文(中国大陆)‎).

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.