1. 程式人生 > 其它 >Linux上後臺保持Terminal互動執行的三種方式:nohub、screen和tmux

Linux上後臺保持Terminal互動執行的三種方式:nohub、screen和tmux

映象下載、域名解析、時間同步請點選 阿里雲開源映象站

後臺執行

Linux上,如果一個程序需要保持後臺執行,尤其是在Linux伺服器上,後臺執行程式、避免因為SSH連線斷開而導致程序停止執行時,該怎麼辦?

很簡單,相信很多人會選擇systemd註冊程序,但是如果只是臨時使用,比如:wget在下載檔案。或者只是偶爾使用呢?(畢竟,systemd配置還是挺麻煩的……)

其實,大體有三種方法:

  • nohup &(Ctril+Z)
  • screen虛擬終端【推薦】
  • tmux終端複用器【推薦】

使用場景

什麼情況下Linux上需要在終端(terminal)上,後臺執行Linux呢?

舉例:Minecraft伺服器執行、Springboot打包的jar……

這個時候,我們終端關閉->SSH斷開->JavaWeb隨即停止執行。這個是因為,我們退出SSH連線時,傳送SIGHUP訊號給控制會話,進而導致我們前臺會話上的程式停止執行。

所以,我們需要用一些方法,後臺儲存執行終端的互動。

Nohup

Nohup全稱是:no hang up,中文直接以上就是不掛起,為什麼是no hang up呢?其實很簡單,舉個例子:我們前臺執行Aria2程序:

這個時候,Aria2程序互動就是掛起(hang up),保持在終端前臺。

而Nohup(no hang up),就是這樣的:

這樣,終端沒有輸出內容,就是Nohup,對應地,我們可以在當前目錄下看到終端輸出內容:

當然,僅僅只有nohup是不夠的,還需要&引數

&引數

這裡的&引數,可不是“和”的意思,是讓當前內容後臺執行。

noup的使用

有了&引數,接下來,我們使用nohup就可以後臺運行了:

# zsh aria2Strat.sh為我用zsh啟動Aria2
nohup zsh aria2Strat.sh &

這樣就可以後臺執行Aria2了。你可以輸入jobs命令檢視後臺的程序:

jobs

不過如果程序沒有守護程序,或者是回發SIGHUP訊號的話...關閉或者退出終端依舊會終止程序(這裡就是終止Aria2程序)。

後臺執行

如果,我們的指令碼或程式,即沒有守護執行緒,也沒有SIGHUP訊號呢?其實還是有兩種方法,首先看Noup的選擇引數:

  • disown:在sh中,可以通過disown -h job名忽略 SIGHUP 訊號;disown命令將移除job表中特定的job,這也意味著該job不再接受任何訊號。
  • Control-Z:通過 Control+Z 可以將當前程序掛起(放置後臺並暫停執行),可通過fg 命令恢復至前臺,也通過bg將掛起的程序後臺執行。
  • shopt:shopt huponexit命令讓sh在登入用的shell退出時,傳送SIGHUP訊號至所有的jobs。

也就是,我們可以使用disown或者Control-Z方式,在終端關閉情況下,後臺執行程序。

Control-Z

這個方法其實很簡單,用了這個方法,甚至不需要&引數(如果不需要保留終端上輸出日誌到nohup.out,不加nohup也可以):

# 執行Aria2
nohup zsh aria2.sh

之後,按Control+Z(Windows使用者應該是Ctril+Z):

這個時候,Aria2已經暫停服務並移動至後臺,我們可以使用jobs命令檢視:

jobs

之後,我們可以使用bg命令,執行Aria2後臺繼續執行:

bg %1

其中,%1指代[1]

相當於,用了&引數,就做了Control+Zbg %1

回到這個後臺程序,輸入:

fg %1

disown引數

如果Control+Z方法不行,我們可以使用disown引數:

nohup zsh aria2Start.sh & disown

這個時候,就可以退出終端了。

當然,這種方法……無法回到後臺程序的控制檯內了~

screen虛擬終端

我其實更推薦screen,這個算是一個終端神器

安裝screen

首先,我們安裝screen:

# Debian
apt-get install screen
# CentOS 8以前
yum install screen
# CentOS 8以後
yum install epel-release
yum install screen

建立虛擬終端

官方給的方法是

screen -S #虛擬終端名字

比如:

但是,我更推薦使用screen -R #虛擬終端名字來建立。以後有機會說原因。

建立好後:

在這個介面,執行程式即可:

之後,按Control+a進入screen的指令接受,再按d即可回到主終端。這個時候,關閉終端,Aria2也不會停止執行。

檢視已經存在的screen

檢視已經存在的screen很簡單,輸入:

screen -ls

即可檢視:

重新進入screen

剛剛我們查看了已經存在的screen,接下來我們重新進入,有兩種方式:

  • PID進入:使用screen -r #PID即可進入
  • screen名:使用screen -R #screen名即可進入

比如,我使用screen - R進入:

screen -R aria2

tmux終端複用器

最後,我們看看tmux終端複用器,這個本質上和screen差不多(我個人還是喜歡用screen,別的原因,就是習慣了……)

安裝tmux

首先是安裝tmux

# centos
sudo yum install tmux
# ubuntu
sudo apt-get install tmux

之後,一般就可以使用了。

建立tmux終端

建立tmux終端很簡單,也是一條命令:

tmux new -s demo

其中,demo為自定義名稱。建立好後:

之後,按Control+btmux指令接受,再按d即可回到主終端。這個時候,關閉終端,執行的程式也不會停止執行。

檢視已經存在的tmux

和screen一樣,tmux檢視已經存在的tmux也很簡單:

tmux ls

重新進入tmux

重新進入的方法很簡單:

tmux -a -t demo

這樣就進入成功了:


總結

本文主要提供三種非systemd註冊的方式,後臺執行Linux程序的方法,個人更推薦使用screen或者tmux,有機會單獨給大家講講這兩個命令。

有小夥伴會問screen和tmux具體區別,其實使用起來基本沒區別,細節的話,就是screen進入後,可以無限套娃新的screen……tmux裡可不會讓使用者這樣套娃……

本文轉自:https://juejin.cn/post/7055128927953485832