我在某個平台上購買了一個雲服務器,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 選定的內容貼上