tmux可以干什么
- ssh遠程到服務器后蔚约,執(zhí)行一個費時的操作吃媒,斷開ssh后任務可以繼續(xù)執(zhí)行,不會中斷
- ssh到遠程服務器爹袁,可以分屏远荠,可以多任務,可以多窗口
tmux是什么
一般我們遠程在服務其上工作都是通過遠程連接軟件進行操作失息,比如使用item2或者xshell之類的終端工具通過ssh來進行遠程連接譬淳。如果需要進行一個比較耗時的操作档址,比如打包運行JavaWeb應用或者處理大文件,一般情況下我們希望可以在下班的時候進行邻梆,然后第二天上班就可以直接看到結果守伸,這樣可以合理的分配自己的工作時間。但是令人尷尬的是浦妄,正常通過ssh啟動的進程都是ssh進程的子進程含友,如果ssh斷開,ssh進程就會被系統(tǒng)kill校辩,與此同時所有通過ssh啟動的進程也都會被killed窘问。這個時候,正常情況下我們會選擇使用nohup等命令來讓其后臺運行宜咒,切斷和ssh進程的聯(lián)系惠赫。但是這樣做也有很多不便之處,比如多命令運行故黑,合理管控儿咱,工作環(huán)境恢復等等。這個時候就不得不提screen或者tmux等工具了场晶。tmux可以看作是screen的升級版本混埠,可以幫助我們后臺運行任務,同時通過其回話诗轻,創(chuàng)建钳宪,分屏等功能,我們可以在ssh中完成更復雜的工作扳炬。即使工作過程中不慎斷開連接吏颖,也可以在重新連接ssh后直接恢復回話,原來運行和打開的程序也都在正常運行恨樟,十分方便半醉。
tmux是一個linux下面的工具,在使用之前需要安裝劝术,就像安裝linux下的其他工具一樣方便缩多。首先我們通過ssh遠程連接登入linux機器,我們將此時的環(huán)境稱為終端環(huán)境养晋。如果這個機器上并沒有安裝tmux衬吆,我們需要安裝。例如在Cent OS上是yum install tmux
匙握,完成之后我們就可以使用tmux命令了咆槽。tmux中有3種概念,會話圈纺,窗口(window)秦忿,窗格(pane)麦射。會話有點像是tmux的服務,在后端運行灯谣,我們可以通過tmux命令創(chuàng)建這種服務潜秋,并且可以通過tmux命令查看,附加到后端運行的會話中胎许。一個會話可以包含多個窗口峻呛,一個窗口可以被分割成多個窗格(pane)。首先我們來看一下tmux的會話辜窑。
tmux的會話
1. tmux new -s session1
新建會話
使用 tmux new -s
命令新建一個會話 -s
(其實是session的頭字母)钩述。后面指定會話名即可。運行之后會從shell的終端環(huán)境進入到會話環(huán)境中穆碎,并停留在剛才新建的會話中牙勘。例如:
可以看到進入session之后的顯示,在下面有一條綠色的狀態(tài)指示欄所禀,左邊顯示的是當前會話的名字方面,緊接著是會話中的窗口(window)序號以及窗口名字。關于窗口的概念我們后面再說色徘,窗口名字后面有一個星號*表示是我們操作的當前窗口恭金,一個會話中可以有多個窗口。當進入一個會話之后褂策,會自動創(chuàng)建一個窗口横腿。如上圖所示,上面的環(huán)境在本章中稱為會話環(huán)境辙培。這樣我們就已經開始了tmux的使用蔑水,如果此時關閉掉終端,下次在進入扬蕊,該會話仍然在運行工。也就是說我們在剛剛進入的會話環(huán)境中使用wget下載一個超大的文件丹擎,或者是編譯一個非常耗時的項目尾抑,我們關閉掉該終端,下次再進入蒂培,這個會話依然存在再愈,會話里面運行的編譯命令或者wget下載命令仍然在運行,并不會因終端的關閉而終止护戳,這正是我們需要的功能翎冲。
2. ctrl+b d
退出會話,回到shell的終端環(huán)境
我們剛才是通過 tmux new -s
命令創(chuàng)建一個tmux會話并進入該會話的媳荒,如果要退出這個會話環(huán)境回到終端環(huán)境(會話里面的程序不會退出在后臺保持繼續(xù)運行)抗悍。應該如何操作呢驹饺,例如上圖,當前我們在tmux的會話環(huán)境中缴渊,使用一個快捷鍵 ctrl+b d
(按ctrl+b
之后再按一個字母d
即可赏壹,字母d是detach的縮寫)。操作之后的結果如下:
可以看到綠色的狀態(tài)欄消失了衔沼,而頂部出現一個[detached]
蝌借,表示已經脫離tmux會話,現在已經不在tmux的會話環(huán)境中回到shell終端環(huán)境中了指蚁。
這里有必要說一下在tmux會話環(huán)境中菩佑,我們經常會用到tmux的組合鍵,一般的組合鍵中都會加一個前綴也就是 ctrl+b
另外凝化,在后面的描述中擎鸠,我們說的終端環(huán)境是指使用終端軟件進入遠程linux之后但是沒有進入tmux的會話環(huán)境的狀態(tài)。
通過上面的操作 ctrl+b d
之后缘圈,回到終端環(huán)境劣光,實際上現在tmux的會話還在后臺運行,如何查看呢糟把。
3. tmux ls
終端環(huán)境查看會話列表
在終端環(huán)境中绢涡,我們可以通過tmux ls
命令來查看后臺運行中的tmux的會話列表,例如:
可以看到在列出的列表中遣疯,只有1行雄可,說明只有一個session,其中左邊的session1
表示該session的名字缠犀,中間2 windows
說明該session1會話中有2個window数苫,右邊表示該會話創(chuàng)建的時間。如果該機器中有多個tmux會話在后臺運行辨液,那么這里會列出多行虐急。因為tmux會話在后臺運行,我們猜測實際上肯定是有tmux的進程在后臺運行來維持這些會話滔迈。我們可以ps
看一下:
可以看到我們之前創(chuàng)建會話的命令還在后端運行止吁。
4. ctrl+b s
會話環(huán)境查看會話列表
上面的命令中我們已經退出了tmux的會話環(huán)境,在終端環(huán)境中通過tmux ls
來列出當前l(fā)inux機器后臺運行的tmux會話列表燎悍。那么假設我們當前環(huán)境已經在tmux的會話環(huán)境中敬惦,我們如何得到當前tmux的會話列表呢,如果每次都要退出當前會話谈山,先回到shell終端環(huán)境再運行tmux ls 來查看就很不方便俄删,那么在tmux的會話環(huán)境中,我們可以通過 ctrl+b s
來獲取當前l(fā)inux機器上tmux所有的后臺會話列表,例如操作之后顯示如下:
此時可以通過方向鍵選擇會話并回車畴椰,在會話間進行切換臊诊。
5. tmux a -t session1 從終端環(huán)境進入會話
如果在終端環(huán)境中運行 tmux ls
查看有tmux會話正在后臺運行,如何進入到該正在后臺中運行的會話呢迅矛,通過運行 tmux a -t session1
即可進入到該已存在的會話 session1
中妨猩。其中a字母是attach的頭字母,表示附加秽褒,-t
指定要進入已存在的會話名壶硅,如果不存在則會報告 session not found
錯誤。
6. tmux kill-session -t session1
銷毀會話
我們可以在終端環(huán)境和會話環(huán)境中銷毀會話销斟,例如在終端環(huán)境中運行 tmux kill-session -t session1
結束名字為session1的tmux會話庐椒。
在會話環(huán)境中運行 ctrl+b :
(注意按組合鍵之后再按一個冒號鍵),狀態(tài)欄變成黃色之后提示我們可以在會話環(huán)境中輸入命令蚂踊,此時輸入 kill-session -t session1
回車即可约谈。其中session1是要銷毀的會話名。
會話銷毀之后犁钟,在終端環(huán)境中運行tmux ls
或者在會話環(huán)境中運行 ctrl+b s
則被銷毀的會話不會再出現在會話列表中棱诱。
7. tmux rename -t old_session_name new_session_name
重命名會話
我們可以在終端環(huán)境中將會話重命名,如上面的命令涝动,重命名之后通過 tmux ls 命令在終端環(huán)境中看到的列表中會顯示會話的新名稱迈勋。
8. ctrl + b $
重命名會話 (在會話環(huán)境中)
在會話環(huán)境中,我們可以通過前綴命令加上 $
的組合來重命名當前打開的會話的名字
tmux的window
一個tmux的會話中可以有多個窗口(window)醋粟,每個窗口又可以分割成多個pane(窗格)靡菇。我們工作的最小單位其實是窗格。默認情況下在一個window中米愿,只有一個大窗格厦凤,占滿整個窗口區(qū)域。我們在這個區(qū)域工作育苟。
本節(jié)我們講解一下tmux窗口的相關操作较鼓,后面我們再說一下關于窗格(pane)的相關知識。首先在新創(chuàng)建的一個會話里面是會默認創(chuàng)建一個窗口的宙搬。正如我們上面提到過的圖一樣笨腥,如下所示:
新創(chuàng)建的會話中會默認創(chuàng)建一個窗口,該窗口名字一般是登陸終端的用戶名@主機名
勇垛,我們可以通過 crtl+b ,
(組合鍵之后按一個逗號)來修改當前窗口的名字,如上圖所示的窗口名字myserver1
就是修改之后的名字士鸥。該名字后面有一個*
號闲孤,表示該窗口是活動窗口(鍵盤輸入會輸入到該窗口中)
1. 創(chuàng)建window
可以在當前會話窗口中創(chuàng)建多個窗口,例如 ctrl+b c
創(chuàng)建之后會多出一個窗口如下圖所示:
默認情況下創(chuàng)建出來的窗口由【窗口序號+窗口名字】組成,窗口名字可以由上面提到的方法修改讼积,可以看到新創(chuàng)建的窗口后面有*
號肥照,表示是當前窗口。
2. 切換window
在同一個會話的多個窗口之間可以通過如下快捷鍵進行切換:
ctrl+b p
(previous的首字母) 切換到上一個window勤众。
ctrl+b n
(next的首字母) 切換到下一個window舆绎。
ctrl+b 0
切換到0號window,依次類推们颜,可換成任意窗口序號
ctrl+b w
(windows的首字母) 列出當前session所有window吕朵,通過上、下鍵切換窗口
ctrl+b l
(字母L的小寫)相鄰的window切換
3. ctrl+b &
關閉window
ctrl+b &
關閉當前window窥突,會給出提示是否關閉當前窗口努溃,按下y
確認即可。當然阻问,如果當前窗口的最后一個程序被exit掉后梧税,窗口也會直接關閉。
tmux的pane
tmux的一個窗口可以被分成多個pane(窗格)称近,可以做出分屏的效果第队。
1. ctrl+b % 垂直分屏(組合鍵之后按一個百分號),用一條垂線把當前窗口分成左右兩屏刨秆。
2. ctrl+b " 水平分屏(組合鍵之后按一個雙引號)凳谦,用一條水平線把當前窗口分成上下兩屏。
分屏之后光標停留在哪個pane上坛善,表示該pane是活動的晾蜘,另外一般情況下當前pane會被綠色的線條圍起來。一般分屏之后當前窗口名字會重置為默認窗口名字眠屎。通過多次分屏操作剔交,我們可以得到各種樣子的分屏效果,例如下圖顯示的是一次垂直分屏之后改衩,在右邊pane中再次水平分屏的效果:
可以看到右下角的分屏是綠色框岖常,說明是當前活動pane
3. 切換pane
ctrl+b o
依次切換當前窗口下的各個pane。
ctrl+b Up|Down|Left|Right
根據按箭方向選擇切換到某個pane葫督。
ctrl+b Space
(空格鍵) 對當前窗口下的所有pane重新排列布局竭鞍,每按一次,換一種樣式橄镜。
ctrl+b z
最大化當前pane偎快。再按一次后恢復。
4. 關閉pane
ctrl+b x
關閉當前使用中的pane洽胶,操作之后會給出是否關閉的提示晒夹,按y確認即關閉。
tmux window中的歷史輸出查看
在tmux里面,因為每個窗口(tmux window)的歷史內容已經被tmux接管了丐怯,當我們在每個tmux的window之間進行來回切換喷好,來回操作,那么我們沒有辦法看到一個window里面屏幕上的歷史輸出读跷。沒辦法使用鼠標滾動查看之前的內容梗搅,在終端中通過鼠標滾動看到的輸出一定是各個tmux的window的輸出混亂夾雜在一起的,如果要看當前窗口的歷史內容效览,那么應該怎么辦呢无切,通過在當前tmux的window 按 ctrl-b
進入copy mode(可以理解為vim的普通模式),然后就可以用PgUp/PgDn來瀏覽歷史輸出了钦铺,按q退出订雾。
總結
tmux中的最重要的三個概念會話,窗口矛洞,pane的使用方法已經介紹完畢洼哎,其實這是我們操作tmux的最常用功能,如果掌握好沼本,足以應付大多數工作噩峦。另外tmux還有一些高級用法,例如可以個性化的配置其組合鍵(官方默認的ctrl+b組合鍵按起來不太方便可以修改抽兆,UI設置识补,鼠標支持,復制粘貼等)辫红,但是我覺得這些高級功能基本不太用的到凭涂。如有需要大家可以自行查閱相關資料。
常見問題
- tmux的自定義配置
tmux可以通過自定義配置文件來覆蓋默認配置贴妻,從從而更改tmux的默認行為切油,配置文件通常為~/.tmux.conf
。
添加如下兩行名惩,就可以使其支持utf8編碼澎胡,同時開啟vi默認的快捷鍵。詳細vi默認下的快捷鍵可以參考文章:【使用 vi 模式操作tmux 屏幕】
set-window-option -g mode-keys vi #可以設置為vi或emacs
set-window-option -g utf8 on #開啟窗口的UTF-8支持
通過自定義配置娩鹉,你可以更改很多東西攻谁,比如默認的Crtl-b,可以更改為自己感覺更為順手的快捷鍵弯予。比如戚宦,我會設置為:crtl-c,因為vim用習慣了锈嫩,這樣更順手阁苞。
- vim配色在tmux中顯示異常
這個問題應該是vimer肯定會遇到的問題了困檩,目前我按照網絡上的教程并未解決我的問題祠挫,后續(xù)解決后會來更新那槽。