Linux 中的 Nohup 命令使您即使在注销后也能运行命令

Nohup 代表“不挂断”。 这是一个非常有用的命令,可以让您的进程在您注销后继续运行。

最常见的用途之一是通过 SSH 连接运行耗时的命令。 如果您认为您的 SSH 会话可能会中断,您可以以这种方式使用带有 nohup 的命令:

nohup your_command &

什么是 nohup 命令?

Nohup 可以看作是一个包装器。 你的命令前缀 诺哈普 像这样:

nohup COMMAND ARGS ....

诺胡普的目的是拦截并阻止 SIGHUP 信号到达 命令.

当您为命令添加前缀时 诺哈普,输入将从不可读的文件( nohup COMMAND < /dev/null )重定向。 简单地说,不要用 诺哈普 如果您需要向该命令发送输入。 当你 诺哈普 一个命令,它需要能够在无人值守的情况下运行。

诺胡普 将首先尝试将输出重定向到 ./nohup.out 或将其发送到 ~/nohup.out 如果需要。 您还可以决定将输出重定向到何处,如下所示:

nohup COMMANDS >/path/to/output/file

没什么好说的 诺哈普,它没有很长的选项列表。 只有 -帮助-版本.

使用 nohup 命令的示例

用 nohup 执行脚本就是这么简单。

nohup ./nhp.sh

注意 诺哈普 没有将进程分叉到后台。 诺胡普 只是为了拦截 SIGHUP 信号。 命令运行后,您可以继续并 close 你的终端。 它会警告您一个进程正在运行。 确认你想杀死它。

当您关闭终端时,所有子进程都会收到一个 SIGHUP 信号。 Nohup 阻止了那个信号到达我的命令。 下图显示了终端仍在运行时有关我的命令的进程信息。

Linux 中的 Nohup 命令使您即使在注销后也能运行命令 1

你看到 PPID 了吗? 那是父进程 ID。 当你要求 close 在终端,PPID 的所有孩子都收到了一个 SIGHUP 信号。 诺胡普 阻止该信号到达我们的脚本。 父进程终止,我们的脚本变得孤立。 当一个进程被孤立时,它会自动分配 1(systemd 或 init)作为父进程。

Linux 中的 Nohup 命令使您即使在注销后也能运行命令 2

如您所见,演示使用确实不难 诺哈普. 很简单的命令。 您可以像这样在后台 fork 进程:

nohup ./nhp.sh &

您还可以决定将输出重定向到何处,如下所示:

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

请注意,如果您关闭或重新启动 Linux 系统,它将终止该命令。 当您请求关闭或重新启动时,所有进程都会收到一个 SIGTERM,然后是一个 SIGKILL。 这些信号不会被拦截 诺哈普.

Nohup 通过 SSH 连接

学习时经常会想到的一种用途 诺哈普 是为了能够通过 SSH 在远程计算机上启动进程。 从逻辑上讲,运行命令 诺哈普 将允许您从 SSH 连接注销,该过程仍将运行。

nohup COMMAND &

一个常见的问题是有时 SSH 在注销时会“挂起”。 这是因为 SSH 通常会拒绝丢失任何进出任何后台进程的数据流。 然后它将“挂起”,直到进程终止。

这个问题通常可以通过重定向所有 3 个数据流来解决。

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

我希望这篇简短的文章能帮助您更好地使用 SSH 会话。 如果您有任何问题或建议,请在下方留言。

相关阅读:

Posted in: Linux