與 tmux 工具較為類似,sreen 命令同樣提供在唯一個的命令行終端上進行多窗口切換和管理的基本功能( 關於 tmux 基本操作可參見筆者的博文 終端復用工具 tmux 基本操作教程 )。
screen 命令以會話( session )為基礎為用戶提供終端復用功能,會話可以被認為是后台運行的程序,其中可以進行命令執行、新窗口創建等操作,不同的會話可以包含有不同的運行內容。當終端綁定到特定會話上時,則該終端會顯示該會話的信息,包括會話中包含的窗口、執行的命令、輸出等。當終端從當前會話解除綁定時,當前終端不再顯示會話的內容,但會話仍然獨立的運行在后台,只有當會話中不再有正在運行的程序時(包括窗口運行的 shell 程序),該會話自動被結束。
screen 安裝
screen 的安裝方式與之前介紹的 tmux 大致相同,用戶可通過 apt 命令直接在個人計算設備上進行安裝。與 tmux 不同的是,一般的 Ubuntu 服務器操作系統會自帶 screen 程序,故而用戶使用服務器時,可直接通過 screen 命令進行終端復用和管理。
apt-get install screen //通過 apt 安裝 screen 命令
會話管理
當用戶在某一終端運行 sreen 命令時,當前終端即進入某個 screen 創建的會話,新建的會話默認擁有一個運行 shell 的窗口,用戶可在該窗口中進行所需操作,並通過 screen 命令進行會話中新窗口的創建、對某個窗口進行面板划分等操作。用戶可通過 screen 命令脫離( detach )某個會話,則該會話會在后台運行而不再顯示到終端上,當前終端也可通過 screen 命令綁定( attach )到某個會話上,從而顯示目標會話中的窗口內容,以供用戶操作。當會話中所有的窗口均退出時,則 screen 會話自動結束
用戶可通過 screen -S 會話名 創建一個新的會話。在終端中運行上述命令后,當前終端即綁定( attach )新創建的會話,新建會話默認創建一個運行 shell 的窗口,用戶即可在其中進行操作。
screen -S session_name //創建名為 session_name 的會話,不指定 session_name 時則創建匿名會話
可通過 screen -d session_name 使得當前終端脫離( 不再顯示 )指定會話,被脫離的會話仍在后台運行,可通過 screen 命令重新綁定.
screen -d session_name //脫離( detach ) 指定的會話,不指定 session_name ,則脫離當前會話
可通過 screen -ls 命令顯示所有存在的會話。
screen -ls //顯示當前存在的所有會話
可通過 screen -r session 使得當前終端重新進入某個會話,用戶既可以使用每個會話擁有的獨立編號指定會話,也可以通過創建會話時的會話名來指定會話。
screen -r session // 使得當前終端重新進入( attach )並顯示 session 指定的會話
用戶也可以直接通過 screen command 的方式創建一個單窗口會話,command 直接指定新建會話中要運行的命令( 不再默認運行 shell ),命令執行完畢則會話自動退出。
screen python main.py // 創建一個運行 main.py 程序的會話,程序運行完成后會話直接退出
對於一個 screen 會話而言,當其中運行的最后一個程序退出時( 如唯一的窗口中的 shell 程序退出 ),會話即自動結束。當會話非自然的無法使用時,通過 screen -ls 查看時,該會話后面會帶有"dead"后綴,用戶可通過 screen -wipe 直接上述刪除這些會話。
screen -wipe //刪除非正常( dead )狀態的會話
完全退出
當前會話不要了,輸入exit命令,就相當於殺死了當前會話進程,不會進行session保存;
為了建立一個窗口,將一個程序放到后端運行,然后退出窗口。我們通常需要將命令放到后台運行,為了以后台進程的方式打開一個程序,只需要添加符號(&)到命令中,如下面所示:
./work &
實例:
1.在服務器登陸的 ssh 終端中新創建一個名為 test 的會話,此時終端會綁定到新創建的終端中並顯示其窗口;
2.在該窗口中輸入 screen -d 則取消當前終端與會話的綁定,此時又回到之前的登錄終端上,終端會顯示 detach 信息;
3.通過 screen -ls 命令顯示所有存在的會話信息,這里可以看到筆者通過 screen 命令創建的會話的 id 和名字;
4.用戶可通過指定會話 id 或會話名的方式通過 screen -r 命令將當前終端重新綁定到指定會話中,終端會重新顯示綁定終端的窗口內容;
窗口管理
在綁定了 screen 會話的窗口中,可以進行 screen 窗口的管理。一般而言常用的窗口管理方式有兩種,一種直接通過命令行輸入 screen 命令,另一種則是通過 screen 會話所支持的 <prefix> + 操作 的方式。在實際使用過程中,由於 screen 會話提供的窗口一般會用於執行用戶所需的命令,故而命令行輸入命令的方式並不總是可用的,筆者更常使用適用范圍更廣的 <prefix> + 操作 的方式進行窗口管理。下列命令即記錄輸入 <prefix> ( screen 的命令前綴為 Ctrl + a )后各個特定輸入與命令之間的對應關系,不再記錄命令前綴。注意,下列窗口管理的功能也可通過命令行輸入命令的方式實現,具體可參見 screen 命令的 man 幫助文檔。
窗口創建和切換
c //創建一個帶有 shell 的新窗口並切換至新窗口 k //關閉當前窗口(以及其中運行的程序) d //退出當前會話 i //顯示當前窗口的信息 w //顯示所有窗口的序號 " //顯示所有窗口,以供選擇切換 num //num 為 0-9 之間的數字,切換至 num 對應的窗口 space / n //切換到下一窗口( next ) backspace / p //切換到上一窗口( previous )
上述操作中,注意通過 <prefix> + d 的快捷操作直接退出退出當前會話,其效果與 screen -d 一致。
窗口划分及其管理
一個完整的終端窗口可以被進一步的划分為若干個小部分,每個部分均可獨立運行程序。
S //將當前終端水平划分 | //將當前終端垂直划分 tab //終端中划分的不同區域進行順序切換 Q //刪除除當前所在區域外的所有的區域 X //刪除當前區域
輔助功能
H //開始/結束對當前窗口輸出的記錄,記錄保存在名為 "screenlog.n" 的文件中 C //清空當前屏幕(終端) l //刷新當前窗口 ? //顯示按鍵與功能的綁定 [ //進入復制模式,其大致操作與 vim 類似,詳見官方文檔及文后參考資料 [ //將復制模式中復制的內容粘貼
問題
有時候會出現想要進入某個會話如 test,但是使用 screen -r test 時並沒有進入已存在的會話,而是新建了會話的情況。通過 screen -ls 命令查看已經存在的會話,發現會話 test 處於 attached 狀態,而不是正常的 detached 狀態。這是因為存在 screen 不正常的脫離會話。解決方法是使用 -D 參數。
screen -D -r test #進入 test 會話,若無法進入,會先退出前一個遠程對話顯示(使得會話進入detached狀態)
本文轉載自:yhjoker