如何在后台运行Linux的命令
通常情况下,当你在终端运行一个命令时,你必须等到该命令完成后才能输入另一个命令。这被称为在前台运行命令或前台进程。当一个进程在前台运行时,它占据了你的shell,你可以使用输入设备与它进行交互。
如果这个命令需要很长时间才能完成,而你想在这期间运行其他命令,怎么办?你有几个选择可以使用。最明显和最直接的选择是启动一个新的shell会话,并在其中运行该命令。另一个选择是在后台运行该命令。
后台进程是一个从终端启动并在后台运行的进程/命令,不需要用户的互动。
在这篇文章中,我们将谈论Linux的后台进程。我们将向你展示如何在后台启动一个命令,以及如何在关闭shell会话后保持该进程的运行。
在后台运行一个Linux的命令
要在后台运行一个命令,请在命令的末尾加上安培符号(&
)。
command &
shell作业ID(用括号包围)和进程ID将被打印在终端上。
输出
[1] 25177
你可以有多个进程同时在后台运行。
后台进程将继续向你调用该命令的终端写信息。要抑制stdout
和stderr
信息,请使用以下语法。
command > /dev/null 2>&1 &
> /dev/null 2>&1
意味着将stdout
重定向到/dev/null
和stderr
重定向到stdout
。
使用jobs
工具来显示当前shell会话中所有停止的和背景的工作的状态。
jobs -l
输出包括作业编号、进程ID、作业状态和启动作业的命令。
输出
[1]+ 25177 Running ping google.com &
要想把一个后台进程带到前台,请使用fg
命令。
fg
如果你有多个后台作业,请在命令后面加上%
和作业ID。
fg %1
要终止后台进程,请使用kill
命令,后面跟上进程ID。
kill -9 25177
将一个前台进程移到后台
要把一个正在运行的前台进程移到后台。
- 通过键入
Ctrl+Z
来停止这个过程。 - 通过键入
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中运行的程序也会继续运行。
总结
要在后台运行一个命令,请在命令的末尾加上&
。
当你在后台运行一个命令时,你不必等到它完成后再去执行另一个命令。
如果你有任何问题或反馈意见,请随时留言。