了解 Linux 中的前台和后台进程
作为 Linux 系统管理员,您有时可能希望在后台运行进程,以便在后台进程完成其工作时继续在命令行终端中工作。 Linux 系统允许同时执行进程并能够在前台和后台运行程序。
如果您需要释放终端或断开与 SSH 会话的连接,那么在 Linux 系统上在后台运行命令或进程就成为一项常见任务。对于长时间运行的命令尤其如此,无论是监听事件还是完成冗长的任务。
我们在 Linux 上有一些在后台运行命令的选项。在本教程中,我们将介绍几种不同的方法,并通过示例向您展示如何使用它们。您还将学习如何将进程从前台移动到后台,反之亦然。
在本教程中您将学习:
如何将正在运行的命令置于后台
如何在后台启动命令
如何关闭终端并保持后台作业运行
如何使用屏幕命令
将正在运行的命令置于后台
当您执行一个想要继续运行很长时间的命令时,问题是您当前的终端专用于该命令。您不能继续使用终端,也不能关闭它,因为这将结束当前正在运行的命令。
如果您正在运行命令,并且需要将其置于后台以释放终端,您可以按键盘上的 Ctrl + Z
来停止该进程。这是一个例子。
$ sleep 10000
^Z
[1]+ Stopped sleep 10000
要在后台查看作业列表,请使用 jobs
命令。
$ jobs -l
[1]+ 1650 Stopped sleep 10000
要将作业返回前台,我们可以使用 fg 命令。
$ fg
如果我们有多个已停止的作业,则需要使用百分号并指定作业 ID 以将相应的作业带回前台。
$ fg %1
太棒了,现在我们可以将进程放入后台,并在以后需要时将它们带回来。但是,如果我们希望命令在后台继续执行怎么办?为此,我们可以使用 bg
命令,后跟 & 符号和作业 ID。以下命令将使我们停止的作业恢复,同时将其保留在后台。
$ bg %1
[1]+ sleep 10000 &
现在我们可以看到该进程仍然在后台,但它显示的状态是“正在运行”而不是“已停止”。 ”
$ jobs -l
[1]+ 1650 Running sleep 10000 &
还有一件事需要记住。您无法关闭当前终端,否则这些后台作业将关闭。如果您需要关闭终端,并且不希望这些命令停止,那么您需要“否认”该作业。如果后台只有一项作业,则以下命令将起作用:
$ disown
如果您有多个,则需要指定作业 ID。
$ disown %1
执行 jobs
命令时,您将不再在作业表中看到该作业。现在可以安全地关闭终端,您的命令将继续运行。
$ jobs -l
您仍然可以使用 ps 命令来监视正在运行的命令。
$ ps aux | grep sleep
linuxco+ 1650 0.0 0.0 8084 524 pts/0 S 12:27 0:00 sleep 10000
如果要停止该命令运行,可以使用kill命令并指定进程ID。
$ kill 1650
在后台启动命令
现在我们已经了解了如何将正在运行的进程放入后台并在稍后调用它。但我们也可以选择一开始就在后台启动命令。您所需要做的就是在任何 Linux 命令末尾添加一个 & 符号。
$ sleep 10000 &
[1] 1900
和以前一样,我们可以使用 jobs
命令查看列出的作业。但这一次,作业已经在运行,我们不必在后台手动启动它。
$ jobs -l
[1]+ 1900 Running sleep 10000 &
关闭终端并保持后台作业运行
我们已经在前面的示例中看到了如何使用 disown
命令来确保命令在关闭终端后继续运行。另一个选项是 nohup 命令。
nohup 告诉进程忽略它收到的任何 SIGHUP(挂断)信号。每当当前终端关闭时,SIGHUP 信号就会发送到后台作业。因此,我们可以在后台运行一个作业,关闭终端,但仍然看到它在后台运行。这是一个例子。
$ nohup sleep 10000 &
[1] 1908
nohup: ignoring input and appending output to 'nohup.out'
我们关闭了终端并重新打开它,然后运行以下命令,这表明该命令仍在运行。
$ ps aux | grep sleep
linuxco+ 1908 0.0 0.0 8084 524 ? S 13:05 0:00 sleep 10000
使用屏幕命令
到目前为止,我们已经介绍了在后台运行命令的默认 Linux 方法。但是,还可以使用额外的软件包。也许最流行的是 screen 命令。
您可以查看上述链接以获取安装说明和详细使用方法,但其要点如下:
运行
screen
命令来启动一个新的“屏幕”。 (可选)包含-S
选项为其命名。$ screen -S mycommand
在新的屏幕会话中,执行您想要放入后台的命令或脚本。
$ /path/to/myscript.sh
按键盘上的
Ctrl + A
,然后按D
。这将分离屏幕,然后您可以关闭终端、注销 SSH 会话等,并且屏幕将持续存在。要查看屏幕列表,请使用此命令。$ screen -ls There is a screen on: 2741.mycommand (04/08/2021 01:13:24 PM) (Detached) 1 Socket in /run/screen/S-linuxconfig.
要重新连接到屏幕,请使用以下命令,并将下面的数字替换为您自己的进程 ID。
$ screen -r 2741
结束语
在本教程中,我们看到了在 Linux 上在后台运行命令的几种不同方法。这包括默认的 Linux 实用程序和 screen 命令。我们还了解了如何通过将作业移至前台、重新连接屏幕和终止后台进程来管理后台进程。