簡介 Screen是一款用於命令行終端切換的自由軟體 用戶可以通過該軟體同時連接多個本地或遠程的命令行會話,併在其間自由切換 GNU Screen可以看作是視窗管理器的命令行界面版本 它提供了統一的管理多個會話的界面和相應的功能 主要優點 screen的優點有很多,但我認為最主要的是可以在網路連接中 ...
簡介
Screen是一款用於命令行終端切換的自由軟體 用戶可以通過該軟體同時連接多個本地或遠程的命令行會話,併在其間自由切換 GNU Screen可以看作是視窗管理器的命令行界面版本 它提供了統一的管理多個會話的界面和相應的功能主要優點
screen的優點有很多,但我認為最主要的是可以在網路連接中斷後,不會丟失對已經打開命令行的控制 其他優點: 1.可以將需要長時間運行的腳本放到後臺運行,雖然nohup和&都有這種功能,但他們不方便再次將其調到前臺進行交互操作 2.可以將視窗共用,即多人可以共用一個視窗,任意一個人產生的輸入輸出,其他人都能看到,共用視窗可以設置密碼保護(如何設置密碼,我還沒查到,希望知道的大神可以回覆一下) 3. 被screen管理的終端,不是放到後臺運行才可以保證進程不中斷,即使在前臺運行時,突然斷電等其他原因導致終端突然關閉,該終端中運行的進程依舊會正常運行,使用screen命令可以繼續調出該終端常用參數和命令
-A 將所有視窗都調整為目前終端機的大小 -d 後接作業名或id,用於將在其他終端前臺運行的視窗離線,也就是放到後臺運行 -r 後接作業名或id,用於恢復離線視窗,也就是重新將該視窗調到前臺運行。 -R 後接作業名或id,如果存在該離線視窗則調到前臺運行,此時類似-r;如果不存在該離線視窗,則創建新視窗,作業名為指定的字元串;如果存在該視窗,但未離線,則創建同名視窗,但id不一樣;這裡可以看出 id 才是視窗的唯一標識 -S 後接作業名,用於指定視窗的作業名 -v 顯示版本 -x 後接作業名或id,如果該screen作業處於離線狀態,則恢復該離線視窗,此時類似於-r參數;如果該視窗處於前臺運行,則當前終端與原終端共用該視窗,具體介紹見下方例子 -X 給 screen 傳遞指令。通常與-S配合,給指定的視窗發送指令;與stuff配合,表示在指定視窗內執行傳遞的命令。具體介紹見下方例子 -ls或--list 顯示目前所有的screen作業 --wipe 檢查目前所有的screen作業,並刪除已經無法使用的screen作業 這裡說明一下: 上面幾乎所有參數,指定作業名時,可以不用指全,只要能夠確定唯一的一個視窗,即使只寫一個字母也可以 如果多個作業名都包含指定的字元串,且其中有一個作業名正好和指定的字元串完全相同,則會選擇該視窗 如果多個作業名都包含指定的字元串,且其中沒有一個作業名正好和指定的字元串完全相同,則會提示有多個符合的視窗,需要重新選擇,並且列出所有符合的視窗 一點建議: 雖然前面介紹的很多參數都可以不用指定完整的作業名,但我還是建議在使用screen時儘量使用id,或者使用完整的作業名 最好保證作業名間不存在包含關係,如儘量不要讓作業名為 test_screen 和 test_screen_a 同時存在 因為,可能會出現想殺死 test_screen 視窗,但是正好這個視窗不存在或者已經被殺死了,就會導致誤殺 test_screen_a 的情況常用命令
新建screen視窗:screen # 該命令會創建一個新視窗,名稱隨機命名,-S 可以用來指定視窗 screen -S test1 # 該命令創建一個名為test1的新視窗,預設進入bash,也就是我們終端剛打開時的樣子 screen -S test2 /bin/bash /tmp/1.sh # 該命令創建一個名為test2的新視窗,並運行腳本1.sh,如果腳本執行結束或者中斷,這整個視窗將被刪除
在交互界面離線視窗: Ctrl+a 然後輸入d,不用回車即可將screen視窗離線。但是在輸入 Ctrl + a 後,界面是沒有任何變化的,沒有任何提示信息,直到輸出d才會離線視窗 在其他終端將scren視窗離線:
screen -d test1
列出所有視窗:
screen -ls
恢復離線視窗:
screen -r test1
在 screen 管理的的視窗中,也可以恢復其他離線視窗: 該命令必須要求當前screen在bash界面,能輸入相應命令,而不是運行一個占用前臺的進程的screen視窗 該命令執行後,使用 screen -ls 顯示的上一層的 screen 視窗仍在前臺運行 這時候如果使用 exit 退出 test1 視窗,或者在其他終端使用 screen -d 離線 test1 視窗,就可以回到上一層視窗了,但如果是使用 ctrl + a 再輸入 d 的方式離線 test1 視窗,那麼該終端會完全退出 screen 管理的視窗,切到系統的終端,但使用 screen -ls 列出的剛纔上一層的視窗依然是活躍的,這時候只能使用 screen -d 去離線視窗,然後再使用 screen -r 進入該視窗了 共用screen視窗:
screen -x test1
當一個screen視窗(譬如test1)在前臺運行時,從另一個視窗執行以上命令,可以實現兩個screen視窗顯示信息完全一致 兩個終端都可以操作該視窗,輸入和輸出會同時顯示在所有終端上 清除無法使用的screen:
screen --wipe
殺死某個session:
screen -X -S test1 quit
或者在交互界面Ctrl+a,然後輸入k
screen在腳本中的運用
screen的常用命令經常伴隨著交互,但如果運用到腳本中,就不允許帶有互動式的命令了 使用screen啟動視窗同時離線運行:screen -d -m -S test1 /bin/bash /tmp/1.sh
該命令會開啟一個test1的screen視窗運行/tmp/1.sh腳本,並將視窗離線 適用於作為一個服務的運行命令 這裡 -m 必須加上,否則不允許直接創建一個離線的視窗 使用screen傳遞輸入給離線視窗:
screen -X -S test1 stuff "THIS IS TEST\n"
命令會向視窗test1中輸入“THIS IS TEST”字元串,並回車 這裡如果不加上 stuff,則表示後面的內容為發給 screen 的命令(與直接在終端執行的命令不同,是給screen發送的指令) 如果加上 stuff,則表示在指定視窗的終端輸入以上字元串,後面加上\n 表示回車 字元串中可以使用腳本中的變數,它會自動讀取變數的值以後再傳入到視窗執行 雖然上面提到的 "screen -X -S test1 quit" 命令也能退出視窗,但該命令直接跟screen發送指令,類似於kill殺死該視窗,視窗中運行的服務不會平緩關閉,存在丟數據的風險 如果自己運行的服務在前臺運行,且收到quit或者其他指令後會平緩退出,可以在加上 stuff 後接上命令,這樣的退出會可控一點