Linux中的Nohup命令

时间:2020-03-05 15:29:05  来源:igfitidea点击:

Nohup代表'no hang up(没有挂断)'。
即使在注销后,它也是一个非常有用的命令。

Linux中的Nohup命令允许您在注销后运行命令

在SSH连接上运行的时间采取命令中可以找到最常用的使用之一。
如果我们认为SSH会话可能会丢弃,我们可以使用Nohup的命令以此时尚:

nohup your_command &

什么是nohup命令?

Nohup可以被视为包装纸。
我们将命令添加为Nohup,如下所示:

nohup COMMAND ARGS ....

NoHUP的目的是拦截和阻止升降信号到达命令。

当我们使用NOHUP前缀命令时,将从不可读的文件中重定向输入(NOHUP命令</dev/null)。
在简单的单词中,如果需要向该命令发送输入,请不要将命令调用nohup。
当你不知所一个命令时,它需要能够无人看管。

Nohup首先尝试将输出重定向到./nohup.out或者如果需要,将它发送到~/nohup.out。
我们还可以决定其中重定向输出:

nohup COMMANDS >/path/to/output/file

关于NOHUP没有多大说法,它没有长期的选项列表。
只有-help和-version。

使用nohup命令的示例

使用NOHUP执行脚本就像这样简单。

nohup ./nhp.sh

请注意,NOHUP没有将过程丢弃到后台。
Nohup只是那里拦截突破信号。
运行命令后,我们可以继续并关闭终端。
它会警告过程正在运行。
确认我们要杀死它。

关闭终端时,所有子进程都收到了SIGHUP信号。
NOHUP阻止该信号到达我的命令。
下图显示了有关终端运行时我的命令的过程信息。

你看到了ppid吗?
这是父进程ID。
当我们要求关闭终端时,PPID的所有子项都会收到突出信号。
NOHUP阻止了信号从到达我们的脚本。
父进程终止,我们的脚本得到了孤立。
当进程获取孤立时,它会自动将1(systemd或者init)分配为父级。

正如你所看到的,它真的不难证明使用NOHUP。
非常简单的命令。
我们可以在背景中拼接到后台:

nohup ./nhp.sh &

我们还可以确定输出被重定向到的位置:

nohup ./nhp.sh >/path/to/file &

请注意,如果关闭或者重新启动Linux系统,它将杀死该命令。

当我们请求关闭或者重新启动时,所有进程都接收Sigterm,然后是Sigkill。
这些信号不是由NOHUP拦截的。

通过ssh连接nohup

当我们学习NOHUP时,一次经常在脑海中致意的用途是能够通过SSH在远程计算机上启动进程。
逻辑上,使用NOHUP运行命令将允许我们从SSH连接注销,并且仍将运行该过程。

nohup COMMAND &

一个常见问题是,有时SSH会在注销时"挂起"。
这是因为SSH经常拒绝丢失任何背景过程的任何数据流。
然后它将"挂起"直到过程终止。

通过重定向所有3个数据流通常可以处理此问题。

nohup COMMAND >./nohup.out 2>./nohup.err &