1. 程式人生 > >xshell中途斷網——tmux解決方法

xshell中途斷網——tmux解決方法

 

$ tmux1

啟動之後,可以看到命令列最底部多了一條綠色的狀態條,上面顯示了一些資訊,比如計算機名和時間等。 要退出 tmux,可以輸入 exit 回車或者按下組合鍵 [Ctrl+d] 。

其實剛才我們啟動 tmux 之後,它已經自動建立了一個會話(Session),會話是 tmux 的最主要的功能,接下來我們將介紹會話的一些功能。

新建會話

啟動 tmux 會自動建立會話,但並沒有為會話命名。為了以後使用方便,我們來建立一個自己命名的會話,命令如下:

 

$ tmux new-session -s <會話名稱>1

現在我們來建立一個會話,取名為 dev ,命令為:

$ tmux new-session -s dev1

建立完成之後,可以看到底部狀態條左邊標示出了當前的會話名為 dev 。

 

這個命令還有一個縮寫版本, new-session 縮寫成 new ,也就是上述命令可以簡寫成:

$ tmux new -s dev1

 

新建會話還可以帶上一個初始命令:

 

$ tmux new -s <會話名稱> 初始命令1

比如建立一個名為 monitor 的會話,初始命令為 top :

 

$ tmux new -s monitor top1

可以看到會話建立後,會自動執行 top 命令。但是一旦退出 top 程式 (按 [q] ),會話也會自動退出,所以在實際應用中,初始命令幾乎不會用到。

 

分離會話(detach)

之前已經說過,退出 tmux 可以使用 exit 命令或者 [Ctrl+d] 組合鍵,退出 tmux 會把會話結束掉,就像平常關閉終端程式一樣。但是在實際應用中,可能你並不希望這樣,因為有些程式是要保持執行的,例如 rails 的測試服務、telnet連線遠端伺服器等等。

這時候分離會話就可以派上用場了,分離後的會話並不會把執行中的程式結束掉,而是會保持執行,你還可以稍後重新連線上這些會話。

分離會話之前,我們先來啟動一個需要保持執行的程式,這裡用 python 2.x 的 SimpleHTTPServer 為例, 當然你也可以選擇啟動 rails 或 django 的測試服務、telnet 連線或者更簡單的 top 命令。

先在之前建立的會話中執行一下命令來啟動一個簡單的 HTTP 服務:

 

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...12

這時候 HTTP 服務已經執行起來了,接下來就要做分離會話的操作了,快捷鍵是:

[Ctrl+b] [d]

也就是先按下組合鍵 [Ctrl+b] 然後再接著按 [d] 。d 代表了 detach,而 [Ctrl+b] 是一個命令字首(官方稱之為 prefix),這個命令字首是告訴終端程式,接下來的命令是針對 tmux 使用的。在之後的描述中,都將採用 [字首] 來代替 tmux 的命令字首。

可以看到,在按下快捷鍵之後,tmux 已經退出並回到平常的終端中,並帶著 [detached] 字樣的提示。

這時候可以在瀏覽器訪問一下剛才啟動的 HTTP 服務 http://localhost:8000,確實可以正常訪問,證明剛才的程式還在保持執行中,並沒有被結束,甚至你還可以把整個終端程式關閉。

可能有人會很不習慣這個預設的命令字首,包括我自己在內,因為 [Ctrl+b] 是一個 Emacs 或 Vim 的快捷鍵,甚至是命令列本身的快捷鍵。在 Emacs 或者命令列中,它是後退一個字元的操作;而在 Vim 中,它是一個向上翻頁的操作。不過不用擔心,先忍耐忍耐,稍後的章節將講述如何配置 tmux,那時就可以擺脫快捷鍵衝突的困擾了。

 

連線會話(attach)

被分離的會話,還可以重新連線上,就讓我們來實踐一下,命令為:

 

$ tmux attach-session -t <目標會話名>1

簡寫為

 

$ tmux attach -t <目標會話名>1

 

$ tmux a -t <目標會話名>1

之前我們建立的會話名叫 dev ,所以命令就可以這樣寫:

 

$ tmux a -t dev1

因為我們只建立了一個會話,所以可以忽略 -t 的引數,直接寫成:

 

$ tmux a1

如果不指定目標會話名,tmux 將會連線你上次使用的會話。連線上 dev 會話之後,可以看到程式還在執行中,而且終端裡顯示的內容跟會話分離前沒什麼兩樣,只是多了幾行 HTTP 請求的日誌。

這時候,你還可以在多個終端,甚至是多臺電腦通過 ssh 連線上同一個會話,可以實現共同操作,非常強大,具體的感受可以自己體會。

接下來我們多建立幾個 tmux 會話,在這之前先把當前會話分離掉:

分離當前會話: [字首] d 
新建一個名為 edit 的會話: tmuxnew−sedit分離edit會話:[字首]d新建一個名為telnet的會話:tmuxnew−sedit分離edit會話:[字首]d新建一個名為telnet的會話: tmux new -s telnet 
分離 telnet 會話: [字首] d

 

ls會話

現在,會話已經足夠多了,接下來登場的就是列出所有會話的命令:

 

$ tmux list-sessions1

可以簡寫成

 

$ tmux ls1

螢幕上將會顯示出所有建立的會話,比如:

dev: 1 windows (created Tue Jun 10 15:10:32 2014) [80x24] 
edit: 1 windows (created Tue Jun 10 16:26:20 2014) [80x24] 
telnet: 1 windows (created Tue Jun 10 16:26:53 2014) [80x24] 
這時候連線會話的 -t 引數就派上用場了,你可以選擇連線到哪一個會話。

如果沒有建立會話或者會話都全已退出,那麼列出所有會話的命令將會提示一個 failed to connect to server 的資訊,可以看得出來 tmux 是有執行一個服務的,這個服務管理著所有的會話,並讓他們持續執行。