Linux 中的 nohup 命令(附示例)——在后台运行进程

nohup 命令,no hang-up 的缩写,用于在后台运行进程。 即使运行它的终端关闭,已被“nohuped”的进程也将继续运行。 有效, nohup 断开进程与终端的连接。

nohup 命令基本用法

在开始使用之前 nohup,重要的是要了解它可以 只要 当进程尚未运行且尚未启动时使用。 (还有其他方法 nohup 一个已经在使用的进程 disown 命令。)

现在我们知道了 nohup 可以和不可以使用的地方,很容易 nohup 一个过程。 只需在命令前加上 nohup:

nohup <command> 

运行 nohup 会做以下事情:

  • 它忽略程序的 SIGHUP 信号. (但是,可以在程序内部更改此行为。本文稍后将详细介绍此异常。)
  • 它关闭了 stdin (该程序将 不是 能够读取任何输入,但会收到错误代码或 EOF 如果它试图阅读)。
  • 它重定向 stdoutstderr 到文件 nohup.out,所以如果终端失败,程序在写入标准输出时不会失败。 这样,程序写入的任何内容都不会丢失。

让我们测试一下 nohup 现在命令。 我们会ping www.linuxfordevices.com.

nohup ping www.linuxfordevices.com 
nohup 命令

但是,如果命令是一个长时间运行的命令,这将占用我们的终端( ping 直到被中断才结束,可以被认为是一个长时间运行的命令)。 这是因为 ping 命令 在前台. 即使您现在关闭终端,ping 仍会继续。

如果您想在“nohuping”命令后继续使用终端执行其他任务,则需要将此命令放入 背景.

Nohup 不占用终端

要将程序置于后台而不占用终端,请附加一个&符号’&‘ 到命令的结尾。 让我们对前面的例子这样做:

nohup <command> & 

在我们的例子中,输入

nohup ping www.linuxfordevices.com & 
在后台运行ping

现在您可以安全地 close 终端和进程将继续在后台运行。 放心,让我们使用 ps 命令在不同的终端中检查进程。

ps aux | grep ping 
图 1从不同的终端观看 ping

从截图中可以看出,有一个 ‘?‘ 在 ping 的输出中。 这 ‘?‘ 表示该进程——在我们的例子中是 ping——没有附加到任何终端。 鉴于,就在`?‘—— /dev/pts0 是终端 grep 我们刚刚运行的命令。

杀死一个 nohuped 进程

要杀死任何进程,更不用说 nohuped 了,你需要知道 进程 ID (PID) 的过程。 使用 ps 命令可以很容易地获得它。 输出的第二列给出了 PID。

ps aux | grep ping 

然后,使用kill命令类型杀死进程

kill <PID> 
图 3杀死进程

Nohup 命令示例

现在让我们看看 nohup 命令的实际用途。

1.通过终端运行GUI应用程序

您可能已经尝试通过终端运行 Chrome 或 VLC。 但是,在这种情况下,问题在于这些应用程序附加到终端,并且在关闭终端时,会向这些应用程序发送 SIGHUP 信号。 应用程序通常在收到此信号时退出。

这是哪里 nohup 很有用。 要在后台运行 VLC 以便它不会在关闭终端时退出,请键入

nohup vlc & 
Nohup Vlcnohup vlc

现在,没有任何文件重定向 nohup 将所有输出/错误写入 nohup.out 主目录中的文件。 这在某些情况下可能是需要的,但在这种情况下,最好忽略 VLC 产生的输出/错误。 我们的最后一个班轮现在是

nohup vlc >/dev/null 2>&1 & 

解释

将标准输出重定向到 /dev/null. 重定向错误( stderr 或者 2 ) 到标准输出的任何地方 ( stdout 或者 1 )。

Chrome – Nohup 的一个例外

某些应用程序(例如 Chrome)有一个已知问题,即即使使用 nohup 命令。 要阅读有关此内容的更多信息,请访问此 StackExchange 答案。

发生这种情况是因为应用程序在收到 SIGHUP 信号时可能会改变行为,绕过 nohup.

解决方法是使用 disown 命令如下

/usr/bin/google-chrome & disown $! 

2.在后台运行服务器

在后台运行服务器对开发人员非常有用。 由于大多数这些服务器都是使用以下命令启动的

npm start #or python manage.py runserver 

这些服务器,像任何其他命令一样,可以与 nohup 允许它们在后台运行,而同一个终端可用于其他任务。

例如,要在后台运行 Python Django 服务器,请键入

nohup python manage.py runserver >~/server_logs 2>&1 & 
服务器使用 Nohup服务器使用 Nohup

输出和错误被重定向到 ~/server_logs.

结论

Nohup 是一个在后台运行进程的非常有用的命令。 它提供了一种快速简便的方法来创建守护进程和后台作业。 要了解有关 nohup 的更多信息,请查看其手册页。 我希望你学到了一些新的东西 nohup 命令通过这篇文章。 请在评论中告诉我们您还不知道 nohup 的哪些用法。