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 阻止了那个信号到达我的命令。 下图显示了终端仍在运行时有关我的命令的进程信息。

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

如您所见,演示 诺哈普. 非常简单的命令。 您可以像这样在后台分叉该进程:

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 会话。 如果您有任何问题或建议,请在下方发表评论。