介绍
作为Linux用户,我们经常使用终端来运行各种命令和程序。运行的命令在某些情况下需要多一点时间才能完成,在这种情况下,我们可能希望在后台运行该命令,以便终端可以自由地进行其他工作。或者,我们可能在SSH会话中远程运行命令,在这种情况下,我们可以方便地在后台启动该进程,然后退出会话。
在本教程中,我们将研究几种将进程与终端完全分离的方法。我们可以使用一些方法在后台启动进程,而一些方法可以帮助我们将已经运行的进程移到后台。
使用bg、fg和jobs
一旦命令开始运行,我们可以按Ctrl+Z冻结进程,然后使用bg命令在后台恢复它。然后我们可以使用jobs命令查看正在运行的后台进程:
sleep 10
bg
jobs
echo
上面的代码片段显示了使用Ctrl+Z停止进程,然后使用
bg将进程移动到后台的过程。运行jobs命令告诉我们前面的命令确实仍在运行,但在后台。10秒后运行另一个随机命令(echo)告诉我们初始命令已完成。
一旦我们使用bg命令将进程移至后台,就可以使用fg命令将其带回前台:
(sleep 11 && echo hello)
bg
fg
使用&操作符
我们可以通过在命令末尾附加&来在后台启动命令:
gedit &
echo "running another command"
kill 122611
从上面我们可以看出,在gedit命令后附加一个&号会将其发送到后台并打印其PID 122611。Gedit 是一个GUI程序,它在桌面上打开,同时让终端可以自由运行其他命令。当我们运行kill命令时,程序退出。
gedit命令的输出可能会打印在这个终端上。为避免这种情况,我们可以将输出重定向到另一个位置,例如 /dev/null:
gedit 1>/dev/null 2>/dev/null &
在这种情况下,我们将输出和错误流重定向到/dev/null,所有可能的输出现在都被抑制了。因此,我们最初只会在终端上收到PID通知,然后只有在进程退出时才会收到通知。
使用nohup
nohup命令用于以不受“挂断”或终端断开影响的方式运行命令。当我们使用nohup启动命令时,该命令会将输出重定向到nohup.out:
nohup echo hello &
在上面的代码片段中,我们使用nohup启动一个命令,在末尾添加&,这样终端就可以自由地运行其他命令。该过程完成后,我们会在nohup.out文件中找到该命令的输出。
使用disown
我们可以运行一个命令,让终端通过在末尾附加& disown来disown该进程:
echo hello & disown
输出
[1] 123128
hello
在disown之后,我们看到该命令首先打印PID,然后是程序的输出,它仍然出现在我们的终端上。为了屏蔽输出,我们可以将其重定向到/dev/null:
echo hello 1>/dev/null 2>/dev/null & disown
现在,该命令只打印PID而不是命令的输出。
使用setsid
当我们使用setsid运行命令时,该命令会在与当前终端断开连接的新会话中启动。与disown和使用&类似,输出会打印在当前终端上,我们可以通过将其重定向到/dev/null来屏蔽输出:
setsid echo hello
setsid echo hello 1>/dev/null 2>/dev/null
在后一种情况下,该命令在终端上不打印任何输出。
使用screen
screen是一个窗口管理器,可以让我们启动和管理多个虚拟终端。要使用screen在后台运行进程,我们可以创建一个新窗口,在那里启动进程并分离窗口。
进入screen
要进入一个新的屏幕窗口,我们只需输入screen命令:
screen
进入后,我们可以按Ctrl+A后跟"(双引号)列出所有活动的屏幕窗口:
我们看到只有一个屏幕窗口。请注意,“[screen_window]”显示在代码片段中只是为了将其与原始终端区分开来,它实际上并没有打印在输出中。
在screen窗口中启动命令
现在让我们在屏幕窗口中启动一个长时间运行的命令:
watch -n 1 date
这将显示类似于下面的输出,它每秒不断刷新,直到我们使用Ctrl+C退出:
从screen窗口中分离
现在,我们可以从这个屏幕窗口中分离出来,并通过按Ctrl+A然后按d返回到我们原来的终端会话。
当我们回到原来的终端时,我们看到了我们之前输入的屏幕命令。我们还在下面看到了一些新的输出,它表示我们从屏幕窗口中分离出来并回到了这里。
返回screen窗口
我们可以通过使用-R参数运行screen重新进入我们的屏幕窗口:
screen -R
退出screen窗口
要退出此屏幕窗口,我们可以按Ctrl+C停止该进程。然后,使用exit命令关闭窗口。
退出屏幕窗口后,我们回到原来的终端。在这里,我们可以看到之前运行的screen -R命令,以及正在终止的输出。
结论
在本教程中,我们研究了几种运行与终端分离的程序的方法。
我们可以使用&运算符和nohup、disown、setsid和screen命令来启动与终端分离的进程。但是,要分离已经启动的进程,我们需要在使用Ctrl+Z暂停进程后使用bg命令。