窗口管理工具 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 後接上命令,這樣的退出會可控一點
相關文章
相關標籤/搜索