screen 是系統管理者的終端機多工神器:單一 SSH 連線下可建立多個虛擬終端、長時間編譯/備份任務斷線不中斷、支援會話分離/重掛、甚至允許多使用者同步檢視同一終端畫面 (遠端協作/教學)。本文涵蓋:安裝、核心快捷鍵、會話管理、分割視窗、日誌記錄、鎖定終端、多使用者共享模式、systemd 服務化常駐、常見問題排解。
# CentOS/RHEL
yum install -y screen
# Debian/Ubuntu
apt-get install -y screen
# 直接啟動新會話
screen
# 或指定會話名稱
screen -S mysession
Ctrl+a 開頭)| 組合鍵 | 動作 | 記憶口訣 |
|---|---|---|
Ctrl+a c | 建立新視窗 | Create |
Ctrl+a n | 切換到下一視窗 | Next |
Ctrl+a p | 切換到上一視窗 | Previous |
Ctrl+a 0-9 | 直接跳至第 0-9 號視窗 | Number |
Ctrl+a " | 視窗列表選單 (可搜尋) | 雙引號像清單 |
Ctrl+a d | 分離會話 (放入背景) | Detach |
Ctrl+a S | 水平分割視窗 (大寫 S) | Split |
Ctrl+a | | 垂直分割視窗 (需新版 screen) | 管線符號像分割 |
Ctrl+a Tab | 在分割區之間切換焦點 | Tab 切換 |
Ctrl+a X | 關閉當前分割區 (大寫 X) | eXit |
Ctrl+a k | 殺掉當前視窗 (確認 y) | Kill |
Ctrl+a x | 鎖定終端 (需密碼解鎖) | Lock |
Ctrl+a ? | 顯示所有快捷鍵幫助 | 問號求助 |
Ctrl+a A | 重命名當前視窗 | Title |
Ctrl+a H | 切換當前視窗日誌記錄 | History log |
screen -ls # 列出所有會話
screen -r # 重掛唯一的分離會話
screen -r 12345 # 重掛指定 PID 會話
screen -r mysession # 重掛指定名稱會話
screen -d -r # 強制分離他處連線並重掛 (搶佔)
screen -D -RR # 終極重掛:有則重掛,無則建立
screen -wipe # 清除已死會話
screen -S name -X cmd # 向指定會話發送指令 (如 stuff "ls\n")
ssh user@server
screen -S build_kernel
make -j$(nproc) # 開始編譯
Ctrl+a d # 分離,可安全關閉 SSH
# ... 回家、換網路 ...
ssh user@server
screen -r build_kernel # 回到編譯畫面,輸出未中斷
screen -S ops
Ctrl+a c # 視窗 0: top 監控
Ctrl+a c # 視窗 1: tail -f /var/log/messages
Ctrl+a c # 視窗 2: vim 配置檔
Ctrl+a n / p # 快速切換
# 演示者
screen -S demo
# 觀看者 (同一台機器不同用戶,或同用戶不同 SSH)
screen -x demo
# 雙方同步看到相同終端輸入輸出,演示者操作,觀看者即時跟隨
權限要求:雙方需為同一系統用戶,或演示者執行 Ctrl+a :multiuser on 並 Ctrl+a :acladd username 授權。
# 啟動時自動記錄
screen -L -S audit_session
# 或會話中 Ctrl+a H 切換
# 日誌檔預設放於當前目錄 screenlog.0
# 啟動訊息關閉
startup_message off
# 底部狀態列 (顯示視窗列表、時間、負載)
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]'
# 滾動緩衝區 10000 行
defscrollback 10000
# 視窗標題自動顯示當前指令
shelltitle '$ |bash'
# 關閉視覺鈴 (閃螢幕)
vbell off
cat > /etc/systemd/system/screen-mytask@.service <<'EOF'
[Unit]
Description=Screen session for %i
After=network.target
[Service]
Type=forking
User=myuser
WorkingDirectory=/home/myuser
ExecStart=/usr/bin/screen -dmS %i /home/myuser/scripts/%i.sh
ExecStop=/usr/bin/screen -S %i -X quit
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now screen-mytask@backup
| 現象 | 原因 | 解決 |
|---|---|---|
| 無法重掛:Attached 狀態 | 另一終端仍連接此會話 | screen -d -r session 強制分離並重掛 |
| 顯示亂碼/顏色異常 | TERM 環境變數不匹配 | export TERM=screen-256color 或在 .screenrc 設定 term screen-256color |
| 分割區無法切換 | 忘記按 Ctrl+a Tab | 必須先按 Ctrl+a 放開,再按 Tab |
| 多用戶共享失敗 | 權限、multiuser 未開啟、acladd 未授權 | 演示者依序執行 Ctrl+a :multiuser on Ctrl+a :acladd viewer |
| scrollback 無法向上翻 | 未進入 copy mode | Ctrl+a Esc 進入 copy mode,再用 PageUp/Down,Esc 離開 |