通常,当您在终端中运行命令时,必须等到命令完成后才能运行另一个命令。这称为在前台或前台进程运行命令。

当某个进程在前台运行时,它将占用您当前的Shell会话,并且您可以使用输入设备与之进行交互。

如果命令需要很长时间才能完成,而同时又要运行其他命令怎么办?您有几种选择可以使用。

最明显和直接的选择是启动另一个Shell会话并在其中运行命令。另一种选择是在后台运行命令。后台进程是在终端启动并在后台运行而无需用户交互的进程。

在本教程中,我们将说明Linux 后台进程。我们将向您展示如何在后台启动命令以及如何在Shell会话关闭时后保持进程的运行。

后台运行Linux命令

要在后台运行命令,请在命令末尾添加&符号,终端的标准输出包括用括号括起来的Shell作业ID和进程ID。例如命令sleep 30 &

您可以同时在后台运行多个进程。后台进程会继续向您启动进程的终端写入消息,这称为进程标准输出stdout或者标准错误stderr

要忽略进程的标准输出标准输入,请运行命令sleep 30 & > /dev/null 2>&1程的标准输出和标准输入重定向空设备文件。

如果你想知道sleep 30 > /dev/null 2>&1 &命令的详细解释,请参考我们的教程标准输入/标准输出/标准错误与重定向

sleep 30 & #[1] 25177
sleep 30 & > /dev/null 2>&1 & 
标准输入,标准输出,标准错误与重定向 | myfreax
0表示标准输入。1表示标准输出。2标准错误。您可以使用这些文件描述符来控制程序或者脚本的输入和输出

查看后台进程运行状态

要查看后台进程的运行状态,可以使用jobs命令打印当前Shell会话启动的所有进程。输出包括作业ID,进程ID,进程状态以及启动进程的命令。

要将后台进程置于前台运行,请使用fg命令。如果您有多个后台作业,请在fg命令后指定作业ID并使用%作为前缀。

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

jobs -l
fg %1
kill -9 25177
[1]+ 25177 Running                 ping google.com &

移动前台进程进入后台

要移动正在运行的前台进程进入后台运行,请先按快捷键Ctrl+Z停止进程正在运行的进程。然后运行bg命令将停止的进程移至后台运行。

例如运行sleep命令sleep 300启动前台进程,然后按下Ctrl+Z停止sleep命令进程。再运行bg命令。

最后运行命令jobs -l查看后台进程的运行状态,确定进程是否进入后台运行,可以通过查看启动命令来确认最近移至后台的进程。

sleep 300
# Ctrl+Z
bg
jobs -l
[5]+  Stopped                 sleep 300
Ctrl+Z
[5]+ sleep 300 &
bg
[1]- 307066 Stopped (signal)        sleep 3600
[2]+ 308313 Stopped (signal)        sleep 3600
[3]  311013 Running                 sleep 3600 &
[4]  340083 Running                 sleep 300 &
jobs -l

退出终端保持后台进程运行

如果SSH连接断开或退出当前Shell会话,后台进程将会终止。在交互式Shell会话结束后,有几种方法可以让后台进程保持运行。

一种方法是使用Shell内置的disown命令从当前Shell会话移除对作业任务的控制。如果您有多个后台作业,请在disown命令后添加%和作业ID指定要移除的作业任务。

要确认从作业表中删除作业任务。请运行命令jobs -l命令要列出所有正在运行的作业任务。

如果你在此时退出当前Shell终端,然后创建另一个终端Shell会话运行命令ps aux | grep "sleep 300" | grep -v grep。你将会看到sleep 300命令的进程还在运行。

sleep 300 &
jobs -l
disown
disown %1
jobs -l
ps aux | grep "sleep 300" | grep -v grep

nohup 后台运行命令

在交互式Shell会话结束后,让后台进程保持运行的另一种方法是使用nohup命令

nohup命令用于运行程序或者命令,并忽略所有中断信号SIGHUPSIGHUP是当前控制终端关闭时发送到进程的信号。

nohup命令的语法形式是nohup COMMAND [ARGS]nohup命令仅接受两个选项--help--version,除此之外没有任何其它没有任何选项。

nohup sleep 300 &命令将会在后台运行命令sleep 300sleep 300命令进程的标准输出重定向到nohup.out文件。

nohup.out文件创建在当前工作目录中。如果运行nohup命令的用户没有当前工作目录的读写权限,nohup.out文件写到用户的家目录。

此时如果您注销或关闭终端,sleep 300命令进程不会终止。

nohup sleep 300 &
nohup: ignoring input and appending output to 'nohup.out'

结论

要在后台运行命令,请在命令末尾添加符号&。当您在后台运行命令时,不必等到命令完成就可以运行另一命令。如果您有任何问题或反馈,请随时发表评论。