作為開發者,不斷和伺服器打交道,最煩躁的是,每次用 ssh 連線伺服器時,總擔心網路不穩定導致在伺服器端執行耗時的任務會被中斷。有時候伺服器一邊在執行命令,一邊又想看看伺服器記憶體、CPU 等執行情況,這時候不得不再開啟一個終端執行 ssh 連線操作。
最近發現一個好工具:「tmux」,恰好能解決這些問題,今天分享出來。
首先說一說 tmux 的好處。
tmux 優點
- 分屏
在 Mac 上,iterm2 也是可以做到分屏,但如果結合 iterm2 與 ssh 的話,iterm2 分屏需要不斷地 ssh ,導致的後果就是有多個使用者連線,使用 who 命令檢視登入使用者數。
舉個例子,如果是 iterm2 分屏三個,則使用者連線數為:3
但,如果是用 tmux 的話,相同的目標,使用者連線數為:1
- attach
attach 可以起到保護現場的作用,不至於因 ssh 超時或者異常退出,而喪失了工作環境。
我做了一個測試,先在 tmux 環境下 git clone
程式碼。
接著關閉 ssh 環境一段時間,然後我重新連線伺服器,這時候發現工作環境保持狀態,並且持續下載中:
其中原理我覺得可以這麼理解:tmux 執行在遠端主機上,充當中介的作用。本地終端應首先 ssh 到遠端主機,然後執行一個 tmux 會話,在會話內的 shell 中執行任務。當本地切斷 ssh 連線時,應當先結束 tmux 會話。由於 tmux 在遠端主機上執行,它可以裝作 ssh 連線從未中斷過。等本地終端再次登入時,又能重新裝載會話,恢復至連線切斷前的狀態,以達到下載從未中斷的目標。
以後我們可以放心的把耗時的任務放在 tmux 下執行了,再也不用擔心本地 ssh 斷連的問題了!
安裝 tmux
在 Mac 下,直接使用 brew
brew install tmux
複製程式碼
在 Centos 7,可以直接用 yum
安裝 tmux:
yum install tmux -y
複製程式碼
但版本會比較低,這裡我們也可以直接用原始碼編譯安裝最新版本:
# 安裝 ncurses-devel 和 libevent-devel
yum -y install ncurses-devel
yum -y install libevent-devel
# 下載原始碼
git clone https://github.com/tmux/tmux.git
# 編譯
cd tmux && sh autogen.sh
./configure && make
# 驗證版本
tmux -V
tmux next-3.1
複製程式碼
注:
- 如果出現
aclocal: 未找到命令
則需要下載安裝 automake 後再執行 autogen.sh
yum install automake -y 複製程式碼
- 如果出現
make: yacc:命令未找到
則需要安裝 bison:
yum install bison -y 複製程式碼
- 如果
make
安裝不了,可以試試make install
連線
首先將遠端連線 key 證書加入 ssh-key 中,以後訪問方便。
ssh-add -k key.pem
複製程式碼
然後,我們在 iterm2 增加一個「Profile」,在「General」加入 「Command」命令:
ssh -t username@remote_host "tmux attach -t coding01 || tmux new -s coding01"
複製程式碼
這個的含義是:如果遠端伺服器已經有 coding01
session,則直接 tmux attach
載入 coding01
session;如果不存在,則會建立一個 coding01
session。
我們可以看看一共有幾個 session:
總結
有了 tmux,我們可以做的還有很多,包括 tmux 的配置、快捷鍵的學習等等,市面上還有人把 tmux 當成藝術來學習。
最後來看看我 tmux 皮膚,我喜歡分成三個 pane,左邊用於常規使用,右上角可以放一些實時性或者有意思的操作 (比如:顯示⏲️);右下角執行 top
命令可以時刻關注伺服器執行情況。
用好工具,提高我們的效率。
未完待續