LINUX使用SSH遠程終端時,如何將運行時間長的程序在后台掛起,下次SSH登陸時繼續使用同一個SHELL?


我在某個平台上購買了一個雲服務器,LINUX操作系統無圖形化界面,硬盤空間較小。雖然在平台上可以通過其自帶網頁版VNC界面登陸SHELL進而操控雲主機,但是每次需要操控都得打開網頁登陸進平台,然后再進行一系列點擊操作才能進入VNC界面,有點繁瑣。並且有時出門在外,使用手機瀏覽器不是很好的兼容VNC界面,所以一般情況下我習慣於通過SSH客戶端登陸SHELL。但是有個問題是,比如我想在雲主機上運行一個神經網絡訓練程序,可能這個程序要跑12小時甚至更久,我不可能一直開着ssh客戶端,但是我關閉了這個客戶端,這個SHELL也隨之湮滅了,訓練進程也被殺了。所以我想有沒有一種方法能在ssh中暫時將這個shell后台運行,然后下次登陸ssh時,可以將這個shell重新調回前台?通過萬能的度娘,我找到了一個能實現功能的命令screen。

screen命令在Debian/Ubuntu系列系統中,可以直接通過apt下載:

sudo apt-get install screen

screen可以開啟虛擬SHELL,在使用時,將其調到前台,當需要關閉ssh時,先將這個虛擬shell放在后台,當然,放到后台,在此shell中的程序將繼續運行,產生的輸出也會記錄在這個虛擬shell中。下次再次登陸SSH時,通過命令將這個虛擬SHELL調到前台即可繼續上次操作 ,並且程序產生的日志和控制台處處都不會丟。

當我們需要創建一個虛擬的SHELL窗口時,使用以下命令,shell_name可以選自己喜歡的名字:

screen -S shell_name

輸入命令后, 窗口重新變為剛登陸時的狀態:

 

這個控制台就是新創建的虛擬SHELL了。我們在這個SHELL中創建一個新文件,然后對這個文件進行編輯。

 

 

 此時,文件還沒編輯完,但是有其它事情需要處理,我們需要關閉SSH客戶端。這時我們就需要將這個虛擬SHELL放到后台運行,依次按下這兩個快捷鍵:

Ctrl+a    d

 

 

 

 

 我們重新返回了SSH為我們開辟的SHELL,並且在這個上面一行顯示我們與5749.test分離,意思就是將這個名稱為test、ID為5749的虛擬shell放在了后台。此時就可以安心關閉shell了。

在我們重新登陸上SSH時,怎樣重新將這個虛擬SHELL調回前台呢?在這個之前,先說一下如何查看當前創建的所有虛擬SHELL:

screen -ls

 

 

 

 我目前有兩個虛擬SHELL,ID分別為5749和18969,狀態均為detached。那么現在將ID為5749,也就是剛剛還沒完成的那個文檔所在的SHELL打開:

screen -r 5749

 

 又重新回到了這個界面,我們可以繼續編輯我們的文檔。

這些就是基本用法,screen命令還有更多強大的用法,我把命令格式放在這里,供需要的朋友們查閱:

這里需要注意,在真實SHELL中,我們用控制台命令進行虛擬SHELL的控制;但是當虛擬控制台在前台時,我們需要用快捷鍵,快捷鍵均以Ctrl+A開始。

更全的命令參考這里

---------在虛擬控制台之外可以用的命令----------
$> screen [-AmRvx -ls -wipe][-d <作業名稱>][-h <行數>][-r <作業名稱>][-s ][-S <作業名稱>]
 
-A  將所有的視窗都調整為目前終端機的大小。
-d   <作業名稱>  將指定的screen作業離線。
-h   <行數>  指定視窗的緩沖區行數。
-m  即使目前已在作業中的screen作業,仍強制建立新的screen作業。
-r   <作業名稱>  恢復離線的screen作業。
-R  先試圖恢復離線的作業。若找不到離線的作業,即建立新的screen作業。
-s  指定建立新視窗時,所要執行的shell。
-S   <作業名稱>  指定screen作業的名稱。
-v  顯示版本信息。
-x  恢復之前離線的screen作業。
-ls或--list  顯示目前所有的screen作業。
-wipe  檢查目前所有的screen作業,並刪除已經無法使用的screen作業。

--------在虛擬控制台內可以用的快捷鍵-----------
C-a ? -> 顯示所有鍵綁定信息
C-a c -> 創建一個新的運行shell的窗口並切換到該窗口
C-a n -> Next,切換到下一個 window 
C-a p -> Previous,切換到前一個 window 
C-a 0..9 -> 切換到第 0..9 個 window
Ctrl+a [Space] -> 由視窗0循序切換到視窗9
C-a C-a -> 在兩個最近使用的 window 間切換 
C-a x -> 鎖住當前的 window,需用用戶密碼解鎖
C-a d -> detach,暫時離開當前session,將目前的 screen session (可能含有多個 windows) 丟到后台執行,並會回到還沒進 screen 時的狀態,此時在 screen session 里,每個 window 內運行的 process (無論是前台/后台)都在繼續執行,即使 logout 也不影響。 
C-a z -> 把當前session放到后台執行,用 shell 的 fg 命令則可回去。
C-a w -> 顯示所有窗口列表
C-a t -> time,顯示當前時間,和系統的 load 
C-a k -> kill window,強行關閉當前的 window
C-a [ -> 進入 copy mode,在 copy mode 下可以回滾、搜索、復制就像用使用 vi 一樣
    C-b Backward,PageUp 
    C-f Forward,PageDown 
    H(大寫) High,將光標移至左上角 
    L Low,將光標移至左下角 
    0 移到行首 
    $ 行末 
    w forward one word,以字為單位往前移 
    b backward one word,以字為單位往后移 
    Space 第一次按為標記區起點,第二次按為終點 
    Esc 結束 copy mode 
C-a ] -> paste,把剛剛在 copy mode 選定的內容貼上

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM