如何不中斷連線保持linux伺服器持續執行 —— screen 使用介紹

CKern發表於2024-03-17

請參考 ck's blog 以獲取最佳觀感

在 linux 伺服器上跑模型的時候,有時會在終端會話中持續了一段時間後超時斷開,或者因為意外情況斷網,如果正常在命令列終端執行程式時,此時會中斷程式的進行,這很惱火,這就意味著要讓程式持續執行,就必須得保持主機和伺服器的連線,程式跑一晚上,主機就得開一晚上,那我還要伺服器幹什麼,為了解決這個問題, screen 是個及其有用的方法。

功能介紹

screen是一個非常強大的終端複用器,它在Linux和類Unix系統中有著廣泛的用途。以下是screen的一些主要用途:

  1. 保持會話在斷開連線後繼續執行: 當你透過SSH等遠端連線工具連線到伺服器時,如果網路連線意外斷開,你的工作可能會丟失。使用screen,即使遠端連線斷開,你的會話也會被保留,並且可以在重新連線後恢復。

  2. 多工處理: screen允許你在一個終端視窗中建立多個會話(稱為“視窗”),並在它們之間輕鬆切換。這對於同時執行多個程序或命令列任務非常有用。

  3. 協作工作: screen支援多個使用者同時連線到同一個會話,這意味著你可以與團隊成員協作工作,即使你們身處不同的地方。

  4. 指令碼和自動化: screen可以與指令碼結合使用,以自動化複雜的任務或流程。例如,你可以編寫一個指令碼來啟動screen會話,執行特定的命令,然後在完成後自動關閉會話。

總之,screen是一個非常靈活且功能強大的工具,它能夠提高你在Linux環境下的工作效率,特別是在遠端工作和多工處理方面。

下載與安裝步驟

下載 screen 元件

# CentOS
yum install screen
# Debian/Ubuntu
apt install screen

如果此時發生報錯:

image-20240315162038927

說明你沒有 root 許可權,你可以透過 sudo -s 獲取 root 許可權後再執行這個操作,如果你和我一樣,作為伺服器的使用者而不是擁有者,本身就沒有 root 許可權,可以透過下面的步驟安裝^{[1]}

(1)下載安裝包到本地

apt-get download your-package-name

(2)安裝到本地

dpkg -x your-package.deb your-dir

(3)將 screen 命令 新增到全域性環境中

找到你本地使用者的 ~/.bashrc 檔案

vim ~/.bashrc # 輸入i進入編輯模式
# 在.bashrc檔案最後面,新增該路徑,按esc 輸入:wq 儲存並退出
export PATH=$PATH:/your_dir/usr/bin/
source ~/.bashrc # 路徑生效

在終端輸入命令 screen -V ,顯示如下介面,即為安裝成功。

image-20240315160708591

screen 的使用

在終端視窗,輸入命令 screen ,即可啟動 screen ,創造一個對話。但如果你沒有 root 許可權,則會發生下面的報錯:

image-20240315162932372

發生這個報錯的原因是因為 screen 在執行過程中,需要在根目錄下建立資料夾,而這個過程需要 root 許可權,所以,我們選擇改變 screen 執行過程中建立資料夾的路徑即可^{[2]}

(1) 建立 .screen 資料夾,並給予許可權

mkdir ~/.screen && chmod 700 ~/.screen

(2) 將該路徑新增到全域性變數

export SCREENDIR=$HOME/.screen

(3) 執行生效

source ~/.bashrc

具體使用方法介紹

以下是一些基本的screen使用方法,部分參考^{[3-4]}

  1. 啟動新的screen會話: 你可以透過以下命令啟動一個新的screen會話:

    screen -S session_name

    其中session_name是你給這個screen會話起的名字。

    如果你只輸入了 screen 也可以啟動一個會話,會自動命名,這裡這個session_name 用處並不大,你既可以透過這個名字來訪問會話,也可以透過 ID 來訪問會話,而 ID 可以透過下條命令獲取。

  2. 列出所有screen會話: 要檢視當前執行的所有screen會話,可以使用:

    screen -ls

    image-20240315171453835

    如上圖所示,這一命令顯示了當前所有對話的 ID 、name 和狀態,其中狀態包括:

    • Attached:表示當前screen正在作為主終端使用,為活躍狀態。

    • Detached:表示當前screen正在後臺使用,為非激發狀態。

  3. 暫時分離當前screen會話: screen會話中,按下Ctrl + A然後按D可以分離當前會話,即使你斷開連線,會話也會繼續執行。分離當前會話後, screen -ls 狀態顯示 Detached ,但這並不影響該會話執行的程式:

image-20240315171727243

  1. 重新連線到screen會話 and 連線其他會話: 如果你之前啟動了一個screen會話,並且它還在執行,你可以使用以下命令重新連線到這個會話(注意,這是針對 Detached 狀態的會話):

    screen -r session_name

    對於仍處於 Attached 狀態的會話,可以直接採用如下命令連線:

    screen session_name

    如果你不確定會話的名稱,可以使用會話ID代替,screen -ls命令會列出所有的會話ID。

  2. 退出screen會話: 要退出當前的screen會話,你可以在會話中輸入:

    exit

    或者使用快捷鍵:

    Ctrl + D

    也可以在主終端內:

    screen -S [pid/Name] -X quit

    注意: 退出當前會話後,會話執行的程式會被中斷,在執行 screen -ls 也無法找到該會話。

    image-20240315172034224

  3. 建立新的視窗: 在Screen環境下,一個對話可以建立多個視窗。使用者可以透過快捷鍵在不同的視窗下切換,並可以自由的重定向各個視窗的輸入和輸出。在screen會話中,你可以建立多個視窗,使用以下命令:

    Ctrl + A Ctrl + C

    這將建立一個新的視窗,並且你可以在不同的視窗之間切換。

  4. 在視窗之間切換: 要切換到其他視窗,可以使用:

    Ctrl + A  數字鍵 0 - 9

    或者使用:

    Ctrl + A  ctrl + A
  5. 關閉當前視窗: 要關閉當前視窗,可以使用:

    Ctrl + A  K

這些是screen的一些基本用法。screen還有很多高階功能,比如複製貼上文字、分屏顯示等,可以透過檢視screen的手冊頁(man screen)來獲取更多資訊。

參考博文

[1] https://www.cnblogs.com/yanqiang/p/13476546.html

[2] https://blog.csdn.net/csy294745333/article/details/104960857

[3] https://zhuanlan.zhihu.com/p/405968623

[4] https://blog.csdn.net/thumbcs/article/details/81072961

相關文章