如何在 Linux 中使用 nohup 命令如何在 Linux 中使用 nohup 命令如何在 Linux 中使用 nohup 命令如何在 Linux 中使用 nohup 命令
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 中使用 nohup 命令

Linux nohup 命令可让重要进程继续运行,即使启动它们的终端窗口已关闭。我们将向您展示如何在当今的 Linux 上使用这个古老的命令。

HUP 和 SIGHUP

Linux 的始祖 Unix 是在 PC 发明之前创建的。计算机是大而昂贵的设备。人们通过同一建筑物内的本地串行线路或通过慢速调制解调器连接远程与它们进行交互。最初,他们在逐渐被哑终端取代的电传打字机上输入指令。

他们之所以被称为哑巴,是因为处理能力在你所连接的计算机上,而不是在你打字的终端上。这些程序是在计算机上运行的——无论它可能位于何处——而不是在你桌上的设备上。

如果您的终端和计算机之间的连接断开,计算机会检测到线路掉线并向您正在运行的程序发送一个HUP 或挂断 信号.程序在收到信号后停止执行。

该功能在今天的 Linux 中仍然存在。在您的 PC 上,终端窗口是物理终端的模拟。如果您有从该终端窗口启动的正在运行的进程并且您关闭了该窗口,则 SIGHUP 信号将发送到程序,以便它们被告知 HUP 并知道他们应该终止。

会发生级联效应。如果这些进程已经启动了任何子进程,SIGHUP 也会向下传递给它们,以便它们知道它们应该终止。

nohup 命令启动子进程但拒绝向它们传递 SIGHUP 信号。这听起来像是个问题,但它实际上是一个有用的功能。

nohup 命令

如果你想让一个进程在启动它的终端窗口关闭的情况下继续,你需要一种拦截 SIGHUP 的方法,这样程序就永远不会接收到它。 (实际上,终端窗口不会启动进程,它们是由终端窗口内的 shell 会话启动的。)该问题的简单而优雅的解决方案是在 shell 会话和程序之间放置另一个进程,并让中间层程序从不传递 SIGHUP 信号。

这就是 nohup 所做的。它为您启动程序,使它们成为 nohup 的子进程,而不是 shell 的子进程。因为它们不是 shell 的子进程,所以它们不会直接从 shell 接收到 SIGHUP。如果 nohup 没有将 SIGHUP 传递给它的子程序,程序将根本不会收到 SIGHUP。

例如,当您有一个长时间运行的流程需要让其运行完成时,这很有用。如果您不小心关闭了终端窗口及其外壳,您也会终止该进程。使用 nohup 启动进程将进程与 nohup 信号隔离开来。如果您通过 SSH 在计算机上远程工作,并且不希望在远程连接失败时终止敏感进程,则可以使用 nohup 在远程计算机上启动该进程。

使用 nohup

我们创建了一个程序,它不做任何有用的事情,但它会一直运行直到终止。它每三秒将时间打印到终端窗口。它被称为“长过程”的 long-proc。

./long-proc

如果这是一个做了一些有用的事情的程序,并且我们希望它在终端窗口和 shell 关闭的情况下继续运行,我们将使用 nohup 启动它。

nohup ./long-proc

该进程与 stdin 和 stdout 分离,因此它既不能接收任何输入也不能写入终端窗口。此外,因为它仍在运行,您不会返回到命令提示符。 nohup 所做的只是让进程不受终端关闭的影响。它不会将该过程变成后台任务。

您现在是否必须重新启动才能终止该过程?否。要停止尚未作为后台进程启动的 nohup 进程,请按 Ctrl+C 组合键。

该程序的输出已被我们捕获在一个名为“nohup.out”的文件中。我们可以用更少的东西来回顾它。

less nohup.out

通常发送到终端窗口的任何内容都被捕获在文件中。 nohup 的后续运行将附加到现有的“nohup.out”文件。

运行该进程的更有用的方法是使用 nohup 启动它,这样它就可以承受终端窗口的关闭,同时使其成为后台任务。为此,我们在命令行末尾添加一个符号“&”。

nohup ./long-proc &

您需要再次按“Enter”键返回命令提示符。我们被告知进程的作业编号是 1——括号“[]”中的数字——进程 ID 是 13115。

我们可以使用其中任何一个来终止进程。 “Ctrl+C”现在不起作用,因为该程序与终端窗口或 shell 没有任何关联。

如果您忘记了作业编号,可以使用 jobs 命令列出从该终端窗口启动的后台任务。

jobs

要终止我们的任务,我们可以使用 kill 命令和作业编号,前面是百分号“%”,如下所示:

kill %1

如果您关闭了终端窗口,则需要找到进程 ID 并将其与 kill 命令一起使用。 pgrep 命令将查找与您提供的搜索线索相匹配的进程的进程 ID。我们将搜索进程名称。

pgrep long-proc

现在我们可以使用进程 ID 来终止进程。

kill 13115

下次您点击“Enter”时,系统会通知您该过程已终止。

现在让我们看看什么不会终止进程。我们将重新启动它,然后关闭终端窗口。

nohup ./long-proc

如果我们打开一个新的终端窗口并使用 pgrep 搜索我们的进程,我们会看到它仍在运行。关闭启动进程的终端窗口没有任何效果。

pgrep long-proc

可以将多个命令传递给 nohup,但通常最好分别启动它们。这使得将它们作为后台作业进行操作变得更加容易。这些命令不会同时运行,它们会一个接一个地执行。执行不是并发的,它是顺序的。要让它们同时运行,您需要单独启动它们。

话虽如此,要同时启动多个进程,请使用 nohup 启动 Bash shell 并使用带有命令字符串的 -c(命令)选项。使用单引号“”将命令列表括起来,使用双“&”符号“&&”分隔命令。

nohup bash -c 'ls /bin && ls /sbin'

如果您使用 less 查看“nohup.out”文件,您将看到第一个进程的输出,然后是第二个进程的输出。

less nohup.out

两个命令的输出都被捕获到“nohup.out”文件中。它没有交织在一起,第二个进程的输出仅在第一个进程终止后才开始。

如果你想使用你自己的文件而不是“nohup.out”,你可以将命令重定向到你选择的文件中。

nohup bash -c 'ls /bin && ls /sbin' > myfile.txt

请注意,该消息不再说“将输出附加到 nohupo.out”,而是说“将 stderr 重定向到 stdout”,我们正在将 stdout 重定向到我们的“myfile.txt”文件。

我们可以用 less 查看“myfile.txt”文件。

less myfile.txt

和以前一样,它包含两个命令的输出。

有趣的是,公用事业的历史有时会让人觉得它与现代无关。 nohup 命令就是其中之一。为应对串行线路断开而创建的东西对于今天使用非常强大的机器的 Linux 用户仍然有用。

©2015-2025 艾丽卡 support@alaica.com