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+Z
和bg %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+b
tmux指令接受,再按d
即可回到主終端。這個時候,關閉終端,執行的程式也不會停止執行。
檢視已經存在的tmux
和screen一樣,tmux檢視已經存在的tmux也很簡單:
tmux ls
重新進入tmux
重新進入的方法很簡單:
tmux -a -t demo
這樣就進入成功了:
總結
本文主要提供三種非systemd
註冊的方式,後臺執行Linux程序的方法,個人更推薦使用screen或者tmux,有機會單獨給大家講講這兩個命令。
有小夥伴會問screen和tmux具體區別,其實使用起來基本沒區別,細節的話,就是screen進入後,可以無限套娃新的screen……tmux裡可不會讓使用者這樣套娃……