Loading AI tools
来自维基百科,自由的百科全书
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
命令。
在Bash,可以通过disown -h job名
忽略 SIGHUP 信号;disown
命令将移除job表中特定的job,这也意味着该job不再接受任何信号。[2][3]
通过 Control+Z 可以将当前进程挂起(放置后台并暂停运行),可通过 fg
命令恢复至前台,也通过bg
将挂起的进程后台运行。
shopt huponexit
命令让Bash在登录用的shell退出时,发送SIGHUP信号至所有的jobs。[4]
需注意的是,在使用 AIX 和 Solaris 系统的nohup
必须添加 p
选项。不同于上述bash内置命令disown
,nohup -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]
$ screen -A -m -d -S somename ./somescript.sh &
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.