如何在后台运行Linux的命令

评论 0 浏览 0 2019-11-02

通常情况下,当你在终端运行一个命令时,你必须等到该命令完成后才能输入另一个命令。这被称为在前台运行命令或前台进程。当一个进程在前台运行时,它占据了你的shell,你可以使用输入设备与它进行交互。

如果这个命令需要很长时间才能完成,而你想在这期间运行其他命令,怎么办?你有几个选择可以使用。最明显和最直接的选择是启动一个新的shell会话,并在其中运行该命令。另一个选择是在后台运行该命令。

后台进程是一个从终端启动并在后台运行的进程/命令,不需要用户的互动。

在这篇文章中,我们将谈论Linux的后台进程。我们将向你展示如何在后台启动一个命令,以及如何在关闭shell会话后保持该进程的运行。

在后台运行一个Linux的命令

要在后台运行一个命令,请在命令的末尾加上安培符号(&)。

command &

shell作业ID(用括号包围)和进程ID将被打印在终端上。

输出

[1] 25177

你可以有多个进程同时在后台运行。

后台进程将继续向你调用该命令的终端写信息。要抑制stdoutstderr信息,请使用以下语法。

command > /dev/null 2>&1 & 

> /dev/null 2>&1意味着将stdout重定向到/dev/nullstderr重定向到stdout

使用jobs工具来显示当前shell会话中所有停止的和背景的工作的状态。

jobs -l

输出包括作业编号、进程ID、作业状态和启动作业的命令。

输出

[1]+ 25177 Running                 ping google.com &

要想把一个后台进程带到前台,请使用fg命令。

fg

如果你有多个后台作业,请在命令后面加上%和作业ID。

fg %1

要终止后台进程,请使用kill命令,后面跟上进程ID。

kill -9 25177

将一个前台进程移到后台

要把一个正在运行的前台进程移到后台。

  1. 通过键入Ctrl+Z来停止这个过程。
  2. 通过键入bg将已停止的进程移到后台。

在 Shell 退出后,保持后台进程的运行

如果你的连接中断或者你注销了shell会话,后台进程就会被终止。有几种方法可以在交互式shell会话结束后保持进程运行。

一种方法是使用disown shell内建程序将作业从shell的作业控制中移除。

disown

如果你有一个以上的后台作业,请在命令后面加上%和作业ID。

disown %1

使用jobs -l命令确认该作业已从活动作业表中删除。要列出所有正在运行的进程,包括不属于自己的,请使用ps aux命令。

另一种在shell退出后保持进程运行的方法是使用nohup

nohup命令执行作为其参数指定的另一个程序,并忽略所有SIGHUP(挂起)信号。SIGHUP是一个信号,当一个进程的控制终端被关闭时,它将被发送到该进程。

要使用nohup命令在后台运行一个命令,请键入:。

nohup command &

该命令的输出被重定向到nohup.out文件。

输出

nohup: ignoring input and appending output to 'nohup.out'

如果你注销或关闭终端,该进程不会被终止。

替换方案

有一些程序可以让你同时进行多个互动环节。

Screen

Screen或GNU Screen是一个终端复用程序,它允许你启动一个屏幕会话并在该会话中打开任意数量的窗口(虚拟终端)。在Screen中运行的进程将在其窗口不可见时继续运行,即使你被断开了连接。

Tmux

Tmux是GNU screen的一个现代替代品。通过Tmux,您还可以创建一个会话并在该会话中打开多个窗口。Tmux会话是持久的,这意味着即使你关闭终端,在Tmux中运行的程序也会继续运行。

总结

要在后台运行一个命令,请在命令的末尾加上&

当你在后台运行一个命令时,你不必等到它完成后再去执行另一个命令。

如果你有任何问题或反馈意见,请随时留言。

最后更新2023-07-02
0 个评论