使用 Nohup Linux 命令在 SSH 注销后保持命令运行
本文将向您展示如何使用 nohup 命令启动进程并使其在注销后保持运行。
Nohup 代表“不挂断”。这是一个非常有用的命令,即使在您注销后也可以让您的进程继续运行。
最常见的用途之一是通过 SSH 连接运行耗时的命令。如果您认为您的 SSH 会话可能会中断,您可以按以下方式使用带有 nohup 的命令:
nohup your_command &
nohup 命令是什么?
Nohup 可以看作是一个包装器。您可以在命令前加上 nohup 前缀,如下所示:
nohup COMMAND ARGS ....
Nohup的目的是拦截并防止SIGHUP信号到达 >命令。
当您的命令带有 nohup 前缀时,输入将从 /dev/null 重定向( nohup COMMAND dev/null )。简而言之,如果您需要向该命令发送输入,请不要使用 nohup 调用该命令。当您nohup命令时,它需要能够在无人值守的情况下运行。
Nohup 将首先尝试将输出重定向到 ./nohup.out 或如果需要的话,会将其发送到~/nohup.out。您还可以决定将输出重定向到何处,如下所示:
nohup COMMANDS >/path/to/output/file
关于nohup没什么好说的,它没有一长串选项。只有-帮助和-版本。
使用 nohup 命令的示例
使用 nohup 执行脚本就这么简单。
nohup ./nhp.sh
请注意,nohup 并未将进程分叉到后台。 Nohup仅用于拦截SIGHUP信号。命令运行后,您可以继续并关闭终端。它会警告您有一个进程正在运行。确认你想杀死它。
当您关闭终端时,所有子进程都会收到 SIGHUP 信号。 Nohup 阻止该信号到达我的命令。下图显示了终端仍在运行时有关我的命令的进程信息。
你看到 PPID 了吗?那是父进程ID。当您请求关闭终端时,PPID 的所有子级都会收到 SIGHUP 信号。 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 &
我希望这篇简短的文章可以帮助您更好地使用 SSH 会话。如果您有疑问或建议,请在下方留言。