= Linux技巧:使用screen管理console命令 = [[PageOutline]] == 動機 == * 當遠端登入時,執行命令到一半,不想等了,中斷掉登入的連線,比如說關掉putty或ssh,執行到一半的程序還會跑嗎? ...顯然,答案是:不會! * 如果我在學校電腦連入一個bbs,沒有斷線後回家用家裡電腦遠端連線到學校該電腦,此時還能看到bbs的畫面嗎?.. 顯然答案還是:不會 * 還有當遠端登入一台機器後,如果需要在視窗內常常查閱數個程序的資訊,比方我要編輯一個abc.sh,編輯時想馬上執行這個abc.sh這隻程式,同時還要執行top觀看系統狀態。如此一來,傳統的作法是,開三個視窗每個視窗都各進行登入程序到主機。但隨後又想看開的port,或不想離開該命令,卻想執行其他指令時,是否又要再新增一個登入的連線,不斷的輸入帳號密碼! == 用screen 可以解決上面的問題 == * 使用screen可以解決SIGHUP問題 * 利用screen這種功能來管理你的遠程會話,保存你所有的工作內容。 == 範例演練 == 定義: C-a :=> Ctrl+ a * 用screen 開啟一個場景,中間離開後,利用-ls查看編號名稱,再用-r 回到場景 {{{ $ screen vi /tmp/abc $ C-a d [detached] $ screen -ls There is a screen on: 11720.pts-4.vpro (Detached) 1 Socket in /var/run/screen/S-waue. $ screen -r 11720 }}} * -dmS可以在背景產生一個被命名的場景,場景編號就是pid,因此可以用kill -9 來刪除,而被刪除的場景,會成線removed狀態,可以透過-wipe清除 {{{ $ screen -dmS mygdb gdb execlp_test $ screen -dmS mytest $ screen -ls There are screens on: 11897.mytest (Detached) 11889.mygdb (Detached) 11720.pts-4.vpro (Detached) $ kill -9 11889 $ screen -ls There are screens on: 11897.mytest (Detached) 11889.mygdb (Dead ???) 11720.pts-4.vpro (Detached) $ screen -ls There are screens on: 11897.mytest (Detached) 11720.pts-4.vpro (Detached) }}} = 進入screen 後的控制命令 = * 執行screen 就可以進入screen 的世界了 {{{ $ screen }}} * screen 用法 {{{ #!sh Use: screen [-opts] [cmd [args]] }}} * 以下為常用的 -opts || -c file || 使用配置文件file,而不使用默認的$HOME/.screenrc || || -d || 不開啟新的screen會話,而是斷開其他正在運行的screen會話 || || -h num || 指定歷史回滾緩衝區大小為num行 || || -ls || 列出現有screen會話,格式為pid.tty.host || || -d || 啟動一個開始就處於斷開模式的會話 || || -S sessionname || 創建screen會話時為會話指定一個名字 || || -v || 顯示screen版本信息 || || -wipe [match] || 同-list,但刪掉那些無法連接的會話 || == 進入screen內的開啟,關閉,切換 == || C-a c 或 C-a C-c || 開啟新的視窗,並同時切換到這個新的視窗 || || C-a n 或 C-a C-n 或 C-a (space) || 切換到下一個視窗(0->1 1->2 ...) || || C-a p 或 C-a C-p || 切換到上一個視窗(1->0 2->1 ...) || || C-a C-a || 切換到上一個顯示過的視窗(不是照順序切換) || || C-a 0 || 切換到第 0 個視窗 || || C-a (1..9) || 切換到第 (1..9) 個視窗 || || C-a w 或 C-a C-w || 會列出目前所開啟的視窗 || || C-a K || 關閉所有的視窗並退出 screen || || C-a ' 或 C-a " || 會出現 "Switch to window:" 字樣,輸入號碼後就可切到該視窗 || == 進入screen內的單一視窗使用中的指令 == || C-a C || 清除目前的視窗內容 || || C-a d 或 C-a C-d || 脫離(detach)目前的 screen ,並放到背景執行(不管開了幾個視窗),下面會再提到 || || C-a D D || 強力脫離,除了放到背景執行外,並自動 logout || || C-a C-g || 視覺化鈴聲(visual bell)的切換,可以在畫面上顯示訊息代表一般的嗶聲 || || C-a H || 紀錄目前視窗所有顯示過的東西(檔名為 screenlog.n n 為視窗號碼) || || C-a i 或 C-a C-i || 顯示目前視窗的資訊 || || C-a l 或 C-a C-l || 重繪視窗,如果有字顯示亂掉了可以用這個指令 || || C-a m 或 C-a C-m 或 C-a (enter) || 可以顯示最近一次顯示過的訊息 || || C-a t 或 C-a C-t || 顯示系統的時間及主機名稱還有負載 || || C-a v || 顯示版本資訊 || || C-a x 或 C-a C-x || 如果你要暫時離開目前位置又不想先 logout ,那可以用這個來鎖住 screen || || C-a ? || 線上求助畫面 || == 進入screen內的複製/捲軸 模式 == 按下 C-a [ 就可以進入 複製/捲軸 模式(只有在目前視窗才算,其他視窗照常)基本上跟 vi 很像: || h, j, k, l || 分別為向左,向下,向上,向右移動一格(或是一行) || || 0 || 移到該行最左邊 || || ^ 與 $ || 分別移到該行最左邊及最右邊的非空白字元 || || w || 以字為單位往前移動並移到字首 || || b || 以字為單位往後移動並移到字首 || || e || 以字為單位往前移動並移到字尾 || || C-b || 向上捲一頁 || || C-f || 向下捲一頁 || || C-u || 向上捲半頁 || || C-u || 向下捲半頁 || || / 與 ? || 向下或向上尋找字串 || || (space) || 第一次按下到第二次按下的區域會被複製到暫存區內 || || (ESC) || 離開 複製/捲軸 模式 || = References = * [http://ericbbs.blogspot.com/2007/12/linux-screen.html linux 技巧:使用 screen 管理你的遠程會話] * [http://lagunawang.pixnet.net/blog/post/2836825 Linux Screen指令]