鏡像下載、域名解析、時間同步請點擊 阿里雲開源鏡像站
后台運行
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+btmux指令接受,再按d即可回到主終端。這個時候,關閉終端,運行的程序也不會停止運行。

查看已經存在的tmux
和screen一樣,tmux查看已經存在的tmux也很簡單:
tmux ls

重新進入tmux
重新進入的方法很簡單:
tmux -a -t demo
這樣就進入成功了:


總結
本文主要提供三種非systemd注冊的方式,后台運行Linux進程的方法,個人更推薦使用screen或者tmux,有機會單獨給大家講講這兩個命令。
有小伙伴會問screen和tmux具體區別,其實使用起來基本沒區別,細節的話,就是screen進入后,可以無限套娃新的screen……tmux里可不會讓使用者這樣套娃……
