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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM