screen命令示例:管理多個終端會話
GNU Screen 是一個終端多路復(fù)用器(窗口管理器)。顧名思義,Screen 可以在多個交互式 shell 之間復(fù)用物理終端,因此我們可以在每個終端會話中執(zhí)行不同的任務(wù)。所有的 Screen 會話都完全獨立地運行程序。因此,即使會話意外關(guān)閉或斷開連接,在 Screen 會話內(nèi)運行的程序或進(jìn)程也將繼續(xù)運行。例如,當(dāng)通過 SSH 升級 Ubuntu 服務(wù)器時,screen
命令將繼續(xù)運行升級過程,以防萬一 SSH 會話因任何原因而終止。
GNU Screen 允許我們輕松創(chuàng)建多個 Screen 會話,在不同會話之間切換,在會話之間復(fù)制文本,隨時連上或脫離會話等等。它是每個 Linux 管理員應(yīng)該在必要時學(xué)習(xí)和使用的重要命令行工具之一。在本簡要指南中,我們將看到 screen
命令的基本用法以及在 Linux 中的示例。
安裝 GNU Screen
GNU Screen 在大多數(shù) Linux 操作系統(tǒng)的默認(rèn)存儲庫中都可用。
要在 Arch Linux 上安裝 GNU Screen,請運行:
$ sudo pacman -S screen
在 Debian、Ubuntu、Linux Mint 上:
$ sudo apt-get install screen
在 Fedora 上:
$ sudo dnf install screen
在 RHEL、CentOS 上:
$ sudo yum install screen
在 SUSE/openSUSE 上:
$ sudo zypper install screen
讓我們繼續(xù)看一些 screen
命令示例。
管理多個終端會話的 Screen 命令示例
在 Screen 中所有命令的默認(rèn)前綴快捷方式是 Ctrl + a
。使用 Screen 時,你需要經(jīng)常使用此快捷方式。所以,要記住這個鍵盤快捷鍵。
創(chuàng)建新的 Screen 會話
讓我們創(chuàng)建一個新的 Screen 會話并連上它。為此,請在終端中鍵入以下命令:
screen
現(xiàn)在,在此會話中運行任何程序或進(jìn)程,即使你與此會話斷開連接,正在運行的進(jìn)程或程序也將繼續(xù)運行。
從 Screen 會話脫離
要從屏幕會話中脫離,請按 Ctrl + a
和 d
。你無需同時按下兩個組合鍵。首先按 Ctrl + a
然后按 d
。從會話中脫離后,你將看到類似下面的輸出。
[detached from 29149.pts-0.sk]
這里,29149
是 Screen ID,pts-0.sk
是屏幕會話的名稱。你可以使用 Screen ID 或相應(yīng)的會話名稱來連上、脫離和終止屏幕會話。
創(chuàng)建命名會話
你還可以用你選擇的任何自定義名稱創(chuàng)建一個 Screen 會話,而不是默認(rèn)用戶名,如下所示。
screen -S ostechnix
上面的命令將創(chuàng)建一個名為 xxxxx.ostechnix
的新 Screen 會話,并立即連上它。要從當(dāng)前會話中脫離,請按 Ctrl + a
,然后按 d
。
當(dāng)你想要查找哪些進(jìn)程在哪些會話上運行時,命名會話會很有用。例如,當(dāng)在會話中設(shè)置 LAMP 系統(tǒng)時,你可以簡單地將其命名為如下所示。
screen -S lampstack
創(chuàng)建脫離的會話
有時,你可能想要創(chuàng)建一個會話,但不希望自動連上該會話。在這種情況下,運行以下命令來創(chuàng)建名為senthil
的已脫離會話:
screen -S senthil -d -m
也可以縮短為:
screen -dmS senthil
上面的命令將創(chuàng)建一個名為 senthil
的會話,但不會連上它。
列出屏幕會話
要列出所有正在運行的會話(連上的或脫離的),請運行:
screen -ls
示例輸出:
There are screens on:
29700.senthil (Detached)
29415.ostechnix (Detached)
29149.pts-0.sk (Detached)
3 Sockets in /run/screens/S-sk.
如你所見,我有三個正在運行的會話,并且所有會話都已脫離。
連上 Screen 會話
如果你想連上會話,例如 29415.ostechnix
,只需運行:
screen -r 29415.ostechnix
或:
screen -r ostechnix
或使用 Screen ID:
screen -r 29415
要驗證我們是否連上到上述會話,只需列出打開的會話并檢查。
screen -ls
示例輸出:
There are screens on:
29700.senthil (Detached)
29415.ostechnix (Attached)
29149.pts-0.sk (Detached)
3 Sockets in /run/screens/S-sk.
如你所見,在上面的輸出中,我們目前已連上到 29415.ostechnix
會話。要退出當(dāng)前會話,請按 ctrl + a d
。
創(chuàng)建嵌套會話
當(dāng)我們運行 screen
命令時,它將為我們創(chuàng)建一個會話。但是,我們可以創(chuàng)建嵌套會話(會話內(nèi)的會話)。
首先,創(chuàng)建一個新會話或連上已打開的會話。然后我將創(chuàng)建一個名為 nested
的新會話。
screen -S nested
現(xiàn)在,在會話中按 Ctrl + a
和 c
創(chuàng)建另一個會話。只需重復(fù)此操作即可創(chuàng)建任意數(shù)量的嵌套 Screen 會話。每個會話都將分配一個號碼。號碼將從 0
開始。
你可以按 Ctrl + n
移動到下一個會話,然后按 Ctrl + p
移動到上一個會話。
以下是管理嵌套會話的重要鍵盤快捷鍵列表。
Ctrl + a "
- 列出所有會話Ctrl + a 0
- 切換到會話號 0Ctrl + a n
- 切換到下一個會話Ctrl + a p
- 切換到上一個會話Ctrl + a S
- 將當(dāng)前區(qū)域水平分割為兩個區(qū)域Ctrl + a l
- 將當(dāng)前區(qū)域垂直分割為兩個區(qū)域Ctrl + a Q
- 關(guān)閉除當(dāng)前會話之外的所有會話Ctrl + a X
- 關(guān)閉當(dāng)前會話Ctrl + a \
- 終止所有會話并終止 ScreenCtrl + a ?
- 顯示鍵綁定。要退出,請按回車 #### 鎖定會話
Screen 有一個鎖定會話的選項。為此,請按 Ctrl + a
和 x
。 輸入你的 Linux 密碼以鎖定。
Screen used by sk <sk> on ubuntuserver.
Password:
記錄會話
你可能希望記錄 Screen 會話中的所有內(nèi)容。為此,只需按 Ctrl + a
和 H
即可。
或者,你也可以使用 -L
參數(shù)啟動新會話來啟用日志記錄。
screen -L
從現(xiàn)在開始,你在會話中做的所有活動都將記錄并存儲在 $HOME
目錄中名為 screenlog.x
的文件中。這里,x
是一個數(shù)字。
你可以使用 cat
命令或任何文本查看器查看日志文件的內(nèi)容。
記錄 Screen 會話
終止 Screen 會話
如果不再需要會話,只需殺死它。要殺死名為 senthil
的脫離會話:
screen -r senthil -X quit
或:
screen -X -S senthil quit
或:
screen -X -S 29415 quit
如果沒有打開的會話,你將看到以下輸出:
$ screen -ls
No Sockets found in /run/screens/S-sk.
更多細(xì)節(jié)請參照 man 手冊頁:
$ man screen
還有一個名為 Tmux 的類似的命令行實用程序,它與 GNU Screen 執(zhí)行相同的工作。要了解更多信息,請參閱以下指南。