通常,当您在终端中运行命令时,必须等到命令完成后才能运行另一个命令。这称为在前台或前台进程运行命令。
当某个进程在前台运行时,它将占用您当前的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 &
查看后台进程运行状态
要查看后台进程的运行状态,可以使用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
退出终端保持后台进程运行
如果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
命令用于运行程序或者命令,并忽略所有中断信号SIGHUP
。SIGHUP
是当前控制终端关闭时发送到进程的信号。
nohup
命令的语法形式是nohup COMMAND [ARGS]
。nohup
命令仅接受两个选项--help
和--version
,除此之外没有任何其它没有任何选项。
nohup sleep 300 &
命令将会在后台运行命令sleep 300
,sleep 300
命令进程的标准输出重定向到nohup.out
文件。
nohup.out
文件创建在当前工作目录中。如果运行nohup
命令的用户没有当前工作目录的读写权限,nohup.out
文件写到用户的家目录。
此时如果您注销或关闭终端,sleep 300
命令进程不会终止。
nohup sleep 300 &
nohup: ignoring input and appending output to 'nohup.out'
结论
要在后台运行命令,请在命令末尾添加符号&
。当您在后台运行命令时,不必等到命令完成就可以运行另一命令。如果您有任何问题或反馈,请随时发表评论。