一款超牛逼的 Linux 終端復(fù)用神器(附安裝、使用教程)
公眾號(hào)關(guān)注“杰哥的IT之旅”,
選擇“星標(biāo)”,重磅干貨,第一時(shí)間送達(dá)!

來(lái)源:
https://www.cnblogs.com/kevingrace/p/6496899.html
Tmux簡(jiǎn)介
Tmux是一個(gè)優(yōu)秀的終端復(fù)用軟件,類(lèi)似GNU Screen,但來(lái)自于OpenBSD,采用BSD授權(quán)。使用它最直觀的好處就是,通過(guò)一個(gè)終端登錄遠(yuǎn)程主機(jī)并運(yùn)行tmux后,在其中可以開(kāi)啟多個(gè)控制臺(tái)而無(wú)需再“浪費(fèi)”多余的終端來(lái)連接這臺(tái)遠(yuǎn)程主機(jī)。是BSD實(shí)現(xiàn)的Screen替代品,相對(duì)于Screen,它更加先進(jìn):支持屏幕切分,而且具備豐富的命令行參數(shù),使其可以靈活、動(dòng)態(tài)的進(jìn)行各種布局和操作。
Tmux 可用于在一個(gè)終端窗口中運(yùn)行多個(gè)終端會(huì)話。不僅如此,還可以通過(guò) Tmux 使終端會(huì)話運(yùn)行于后臺(tái)或是按需接入、斷開(kāi)會(huì)話,這個(gè)功能非常實(shí)用。
Tmux的使用場(chǎng)景
1)可以某個(gè)程序在執(zhí)行時(shí)一直是輸出狀態(tài),需要結(jié)合nohup、&來(lái)放在后臺(tái)執(zhí)行,并且ctrl+c結(jié)束。這時(shí)可以打開(kāi)一個(gè)Tmux窗口,在該窗口里執(zhí)行這個(gè)程序,用來(lái)保證該程序一直在執(zhí)行中,只要Tmux這個(gè)窗口不關(guān)閉
2)公司需要備份數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)量巨大,備份兩三天弄不完,這時(shí)不小心關(guān)閉了終端窗口或誤操作就前功盡棄了,使用Tmux會(huì)話運(yùn)行命令或任務(wù),就不用擔(dān)心這些問(wèn)題。
3)下班后,你需要斷開(kāi)ssh或關(guān)閉電腦,將運(yùn)行的命令或任務(wù)放置后臺(tái)運(yùn)行。
4)關(guān)閉終端,再次打開(kāi)時(shí)原終端里面的任務(wù)進(jìn)程依然不會(huì)中斷
Tmux功能
提供了強(qiáng)勁的、易于使用的命令行界面
可橫向和縱向分割窗口
窗格可以自由移動(dòng)和調(diào)整大小,或直接利用四個(gè)預(yù)設(shè)布局之一
支持 UTF-8 編碼及 256 色終端
可在多個(gè)緩沖區(qū)進(jìn)行復(fù)制和粘貼
可通過(guò)交互式菜單來(lái)選擇窗口、會(huì)話及客戶端
支持跨窗口搜索
支持自動(dòng)及手動(dòng)鎖定窗口
Tmux安裝
ubuntu版本下直接apt-get安裝
# sudo apt-get install tmux
centos7版本下直接yum安裝
# yum install -y tmux
Centos6 編譯安裝 tmux官網(wǎng)下載地址:http://tmux.github.io/
# yum install libevent libevent-devel ncurses-devel
# tar -zvxf tmux-2.3.tar.gz (提前下載:wget https://github.com/tmux/tmux/releases/download/2.3/tmux-2.3.tar.gz)
# cd tmux-2.3
# ./configure
# make && make install
1)make編譯tmux時(shí),可能出現(xiàn)的錯(cuò)誤
control.c: In function ‘control_callback’:
control.c:63: warning: implicit declaration of function ‘evbuffer_readln’
control.c:63: error: ‘EVBUFFER_EOL_LF’ undeclared (first use in this function)
control.c:63: error: (Each undeclared identifier is reported only once
control.c:63: error: for each function it appears in.)
control.c:63: warning: assignment makes pointer from integer without a cast
make: *** [control.o] Error 1
原因:使用的libevent的版本太低造成的,tmux1.8要求libevent>= 2.0.10-stable
解決辦法:
# yum remove libevent libevent-devel //先卸載yum安裝的libevent
# rpm -qa|grep libevent //確保已經(jīng)卸載
到http://libevent.org/里面下載最新版的libevent
# tar -zvxf libevent-2.0.21-stable.tar.gz (提前下載:wget https://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz)
# cd libevent-2.0.21-stable
# ./configure
# make && make install
# ll /usr/local/lib/libevent.so
然后再接著make編譯tmux就順利通過(guò)了~~
2)運(yùn)行tmux可能出現(xiàn)的錯(cuò)誤:
tmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
解決辦法:建立相應(yīng)的軟鏈接
32bit系統(tǒng)
# ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5
64bit系統(tǒng)
# ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
在Mac OS中安裝
安裝 Homebrew
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安裝tmux
$ brew install tmux
Tmux的使用
安裝完成后輸入命令tmux即可打開(kāi)軟件,界面十分簡(jiǎn)單,類(lèi)似一個(gè)下方帶有狀態(tài)欄的終端控制臺(tái);但根據(jù)tmux的定義,在開(kāi)啟了tmux服務(wù)器后,會(huì)首先創(chuàng)建一個(gè)會(huì)話,而這個(gè)會(huì)話則會(huì)首先創(chuàng)建一個(gè)窗口,其中僅包含一個(gè)面板;也就是說(shuō),這里看到的所謂終端控制臺(tái)應(yīng)該稱作tmux的一個(gè)面板,雖然其使用方法與終端控制臺(tái)完全相同。
# tmux //直接進(jìn)入面板,如下使用效果:

Tmux的快捷鍵使用說(shuō)明



需要注意:進(jìn)入tmux面板后,一定要先按ctrl+b,然后松開(kāi),再按其他的組合鍵才生效。
常用到的幾個(gè)組合鍵
ctrl+b ? 顯示快捷鍵幫助
ctrl+b 空格鍵 采用下一個(gè)內(nèi)置布局,這個(gè)很有意思,在多屏?xí)r,用這個(gè)就會(huì)將多有屏幕豎著展示
ctrl+b ! 把當(dāng)前窗口變?yōu)樾麓翱?br>ctrl+b " 模向分隔窗口
ctrl+b % 縱向分隔窗口
ctrl+b q 顯示分隔窗口的編號(hào)
ctrl+b o 跳到下一個(gè)分隔窗口。多屏之間的切換
ctrl+b 上下鍵 上一個(gè)及下一個(gè)分隔窗口
ctrl+b C-方向鍵 調(diào)整分隔窗口大小
ctrl+b & 確認(rèn)后退出當(dāng)前tmux
ctrl+b [ 復(fù)制模式,即將當(dāng)前屏幕移到上一個(gè)的位置上,其他所有窗口都向前移動(dòng)一個(gè)。
ctrl+b c 創(chuàng)建新窗口
ctrl+b n 選擇下一個(gè)窗口
ctrl+b l 最后使用的窗口
ctrl+b p 選擇前一個(gè)窗口
ctrl+b w 以菜單方式顯示及選擇窗口
ctrl+b s 以菜單方式顯示和選擇會(huì)話。這個(gè)常用到,可以選擇進(jìn)入哪個(gè)tmux
ctrl+b t 顯示時(shí)鐘。然后按enter鍵后就會(huì)恢復(fù)到shell終端狀態(tài)
ctrl+b d 脫離當(dāng)前會(huì)話;這樣可以暫時(shí)返回Shell界面,輸入tmux attach能夠重新進(jìn)入之前的會(huì)話
tmux的常規(guī)運(yùn)維命令
新建會(huì)話,比如新創(chuàng)建一個(gè)會(huì)話以"ccc"命名
tmux new -s ccc
加上參數(shù)-d,表示在后臺(tái)新建會(huì)話
root@bobo:~# tmux new -s shibo -d
root@bobo:~# tmux ls
shibo: 1 windows (created Tue Oct 2 19:22:32 2018) [135x35]
查看創(chuàng)建得所有會(huì)話
[root@Centos6 ~]# tmux ls
0: 1 windows (created Wed Aug 30 17:58:20 2017) [112x22](attached) #這里的attached表示該會(huì)話是當(dāng)前會(huì)話
aaa: 2 windows (created Wed Aug 30 16:54:33 2017) [112x22]
ccc: 1 windows (created Wed Aug 30 17:01:05 2017) [112x22]
登錄一個(gè)已知會(huì)話。即從終端環(huán)境進(jìn)入會(huì)話。第一個(gè)參數(shù)a也可以寫(xiě)成attach。后面的aaa是會(huì)話名稱。
[root@Centos6 ~]# tmux a -t aaa
退出會(huì)話不是關(guān)閉:
登到某一個(gè)會(huì)話后,依次按鍵ctrl-b + d,這樣就會(huì)退化該會(huì)話,但不會(huì)關(guān)閉會(huì)話。
如果直接ctrl + d,就會(huì)在退出會(huì)話的通話也關(guān)閉了該會(huì)話!關(guān)閉會(huì)話(銷(xiāo)毀會(huì)話)
[root@Centos6 ~]# tmux ls
aaa: 2 windows (created Wed Aug 30 16:54:33 2017) [112x22]
bbb: 1 windows (created Wed Aug 30 19:02:09 2017) [112x22]
[root@Centos6 ~]# tmux kill-session -t bbb
[root@Centos6 ~]# tmux ls
aaa: 2 windows (created Wed Aug 30 16:54:33 2017) [112x22]
重命名會(huì)話
[root@Centos6 ~]# tmux ls
wangshibo: 1 windows (created Sun Sep 30 10:17:00 2018) [136x29] (attached)
[root@Centos6 ~]# tmux rename -t wangshibo kevin
[root@Centos6 ~]# tmux ls
kevin: 1 windows (created Sun Sep 30 10:17:00 2018) [136x29] (attached)
tmux的遠(yuǎn)程批量操作的shell腳本
在使用SSH或telnet遠(yuǎn)程連接服務(wù)器時(shí),可能都遇到為一些長(zhǎng)時(shí)間運(yùn)行的任務(wù)而頭疼,比如系統(tǒng)備份、ftp 傳輸?shù)鹊取MǔG闆r下我們都是為每一個(gè)這樣的任務(wù)開(kāi)一個(gè)遠(yuǎn)程終端窗口,因?yàn)樗麄儓?zhí)行的時(shí)間太長(zhǎng)了。必須等待它執(zhí)行完畢,在此期間可不能關(guān)掉窗口或者斷開(kāi)連接,否則這個(gè)任務(wù)就會(huì)被殺掉,一切半途而廢了。也許nohup命令可以達(dá)到這個(gè)目的,如果程序的標(biāo)準(zhǔn)輸出/標(biāo)準(zhǔn)錯(cuò)誤是終端, nohup默認(rèn)將其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信號(hào),還需要使用標(biāo)記&把它放在后臺(tái)運(yùn)行。
nohup <command> [argument…] &
雖然nohup很容易使用,但還是比較“簡(jiǎn)陋”的,對(duì)于簡(jiǎn)單的命令能夠應(yīng)付過(guò)來(lái),對(duì)于復(fù)雜交互的程序就麻煩了。
使用tmux打開(kāi)一個(gè)終端窗口,可以在窗口里執(zhí)行一個(gè)長(zhǎng)時(shí)間運(yùn)行的交互式命令操作,令其一直在后臺(tái)跑著,并且在按鍵ctrl-b-d后,可以無(wú)感知的退出窗口,而退出后窗口不會(huì)關(guān)閉,即窗口里執(zhí)行的交互命令也不會(huì)結(jié)束。這比起傳統(tǒng)的"nohup commang & (然后按ctrl+c)"的方式要還用很多。
如何在linux終端里創(chuàng)建一個(gè)tmux窗口的同時(shí)直接在窗口終端里執(zhí)行命令呢?這就需要用到tmux send -t session_name "command" ENTER!!!
示例一
root@bobo:~# tmux new -d -s kevin_session && tmux send -t kevin_session '/usr/local/bin/main' ENTER && tmux attach -t kevin_session
[detached (from session kevin_session)]
root@bobo:~# tmux ls
kevin_session: 1 windows (created Tue Oct 2 19:38:36 2018) [135x34]
上面的命令可以拆分為下面三個(gè):
root@bobo:~# tmux new -d -s kevin_session
root@bobo:~# tmux send -t kevin_session '/usr/local/bin/main' ENTER
root@bobo:~# tmux attach -t kevin_session
解釋說(shuō)明:上面涉及到三個(gè)命令
第一個(gè)表示:在后臺(tái)創(chuàng)建一個(gè)窗口,名為kevin_session
第二個(gè)表示:創(chuàng)建窗口的同時(shí)在終端里執(zhí)行命令'/usr/local/bin/main',這里用單引號(hào)或雙引號(hào)都可以。
第三個(gè)表示:進(jìn)入到剛才創(chuàng)建的窗口kevin_session里面去
示例二
在創(chuàng)建窗口的同時(shí),可以同時(shí)在窗口終端里連續(xù)執(zhí)行兩個(gè)或多個(gè)命令
root@bobo:~# su - kevin -c "tmux new -d -s haha && tmux send -t haha 'ifconfig' ENTER && tmux send -t haha 'hostname' ENTER"
kevin_session: 1 windows (created Tue Oct 2 19:38:36 2018) [135x34]
root@bobo:~# su - kevin
kevin@bobo:~$ tmux ls
haha: 1 windows (created Tue Oct 2 19:48:12 2018) [135x34]
kevin@bobo:~$ tmux a -t haha
如下一個(gè)實(shí)例:
在遠(yuǎn)程進(jìn)行tmux的批量關(guān)閉和批量開(kāi)啟的shell腳本操作
1)批量關(guān)閉/opt/ip.list文件里ip所在機(jī)器的main二進(jìn)制進(jìn)程(這個(gè)main進(jìn)程是在tmux執(zhí)行的,一直交互執(zhí)行的那種)
[root@shell002 ~]# vim /opt/script/6_main_stop.sh
#!/bin/bash
for i in $(cat /opt/ip.list)
do
ssh -p22 root@$i 'ps -ef|grep main|grep -v grep|awk -F" " "{print $2}"|xargs kill -9 >/dev/null 2>&1'
done
2)批量開(kāi)啟/opt/ip/list文件里ip所在機(jī)器的tmux窗口里的main二進(jìn)制進(jìn)程(即先關(guān)閉tmux,再創(chuàng)建tmux窗口以及在里面執(zhí)行main進(jìn)程)
[root@shell002 ~]# vim /opt/script/7_main_start.sh
#!/bin/bash
for i in $(cat /opt/ip.list)
do
ssh -p22 root@$i 'ps -ef|grep tmux|grep -v grep|awk -F" " "{print $2}"|xargs kill -9 >/dev/null 2>&1'
ssh -p22 root@$i 'tmux new -d -s kevin_session && tmux send -t kevin_session '/usr/local/bin/main' ENTER'
done
如果您覺(jué)得這篇文章對(duì)您有點(diǎn)用的話,麻煩您為本文來(lái)個(gè)四連:轉(zhuǎn)發(fā)分享、點(diǎn)贊、點(diǎn)在看、留言,因?yàn)檫@將是我寫(xiě)作與分享更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!
本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)后臺(tái)回復(fù)「m」獲取!
推薦閱讀:
1、4 款超級(jí)好用的終端文件管理器,提高你的使用效率!
2、Linux用戶必須知道的常用終端快捷鍵
3、GitHub 神器:寫(xiě)代碼、搜問(wèn)題,全部都在「終端」完成!
4、Linux 終端下記不住命令的使用方法?這個(gè)開(kāi)源項(xiàng)目幫你解決。
5、12 款 Linux 終端推薦
關(guān)注微信公眾號(hào)「杰哥的IT之旅」,后臺(tái)回復(fù)「1024」查看更多內(nèi)容,回復(fù)「加群」備注:地區(qū)-職業(yè)方向-昵稱 即可加入讀者交流群。
推薦閱讀:
2、Linux用戶必須知道的常用終端快捷鍵
3、GitHub 神器:寫(xiě)代碼、搜問(wèn)題,全部都在「終端」完成!
4、Linux 終端下記不住命令的使用方法?這個(gè)開(kāi)源項(xiàng)目幫你解決。
5、12 款 Linux 終端推薦
點(diǎn)個(gè)[在看],是對(duì)杰哥最大的支持!
