使用screen命令
到目前为止,我们介绍了在后台运行命令的默认Linux方法。
但是,还可以使用另外的软件包。
也许最受欢迎的是screen命令。
- 运行
screen
命令启动一个新的“屏幕”。可选地,包括“-s”选项以提供名称。
$screen -S mycommand
- 在新screen会话中,执行要放入后台的命令或者脚本。
$/path/to/myscript.sh
- 按键盘上的“Ctrl + A”,然后按“D”。这将分离屏幕,然后我们可以关闭终端,屏幕将持久地关闭SSH会话等终端,退出。要查看屏幕列表,请使用此命令。
$screen -ls There is a screen on: 2741.mycommand (04/08/2021 01:13:24 PM) (Detached) 1 Socket in /run/screen/S-onitroad.
- 要重新连接到屏幕,请使用以下命令,将下面的数字与我们自己的进程ID代替。
$screen -r 2741
在后台启动命令
现在,我们已经了解了如何将正在运行的流程放到后台,并在以后调用它。但是我们也可以选择在开始时在后台启动命令。您所需要做的就是在任何Linux命令的末尾添加一个符号。
$sleep 10000 & [1] 1900
与前面一样,我们可以看到使用'jobs'命令列出的作业。不过,这次作业已经在运行,我们不必在后台手动启动它。
$jobs -l [1]+ 1900 Running sleep 10000 &
关闭终端并保持后台作业运行
我们已经在前面的示例中看到了如何使用'disown'命令来确保在关闭终端后命令继续运行。另一个选项是'nohup'命令。
nohup告诉进程忽略它接收到的任何“SIGHUP”(挂断)信号。只要当前终端关闭,SIGHUP信号就会发送到后台作业。因此,我们可以在后台有一个作业,关闭终端,仍然可以看到它在后台运行。
例如:
$nohup sleep 10000 & [1] 1908 nohup: ignoring input and appending output to 'nohup.out'
我们已关闭终端并重新打开,然后运行以下命令,显示命令仍在运行。
$ps aux | grep sleep linuxco+ 1908 0.0 0.0 8084 524 ? S 13:05 0:00 sleep 10000
将运行命令放入后台
执行想要长时间继续运行的命令时,问题是我们当前的终端将专用于命令。
我们无法继续使用终端,并且我们也无法关闭它,因为这将结束当前正在运行的命令。
如果我们有命令运行,并且需要将其放入后台释放终端,则可以按键盘上的“Ctrl + Z”以停止此过程。
例如:
$sleep 10000 ^Z [1]+ Stopped sleep 10000
要在后台查看作业列表,请使用'jobs'命令。
$jobs -l [1]+ 1650 Stopped sleep 10000
要使作业返回前台,我们可以使用'fg'命令。
$fg
如果有多个停止的作业,则需要使用百分号并指定作业ID,以便将相应的作业带回前台。
$fg %1
现在我们可以把进程放到后台,以后需要时再把它们带回来。但是如果我们想让命令在后台继续执行呢?
为此,我们可以使用'bg'命令,后跟一个符号和作业ID。以下命令将使停止的作业恢复,同时将其保留在后台。
$bg %1 [1]+ sleep 10000 &
现在我们可以看到这个过程仍在后台,但它显示了“运行”而不是“停止”的状态。
$jobs -l [1]+ 1650 Running sleep 10000 &
仍然有一件事要记住。
我们无法关闭当前的终端,或者这些后台作业将关闭。
如果我们需要关闭终端,并且不希望这些命令停止,那么我们需要“disown”作业。
如果在后台中只有一个作业,则以下命令将有效:
$disown
如果我们有多个,那么我们需要指定作业ID。
$disown %1
执行“jobs”命令时,我们将不再在工作表中看到作业。
现在关闭终端安全,命令将继续运行。
$jobs -l
您仍然可以使用ps命令监视正在运行的命令。
$ps aux | grep sleep linuxco+ 1650 0.0 0.0 8084 524 pts/0 S 12:27 0:00 sleep 10000
如果要停止命令运行,则可以使用kill命令并指定进程ID。
$kill 1650
如果需要释放终端或者断开与SSH会话的连接,在Linux系统的后台运行命令或者进程将成为一项常见任务。
对于长时间运行的命令尤其如此,这些命令用于侦听事件或者完成其冗长的任务。
在Linux上,我们有一些在后台运行命令的选项。
在本教程中,我们将介绍几种不同的方法,并通过示例向您展示如何使用它们。