screen命令
Screen是一個可以在多個進程之間多路複用一個物理終端的窗口管理器。Screen中有會話的概念,用戶可以在一個screen會話中創建多個screen窗口,在每一個screen窗口中就像操作一個真實的telnet/SSH連接窗口那樣。創建screen窗口的方法有:
1. 直接在命令行鍵入screen命令
[sjy@xxx ~]$ screen
2. Screen命令+要執行的程序(創建一個執行vim test.txt的新窗口會話,退出vim會退出該窗口/會話)
[sjy@xxx ~]$ screen vim test.txt
3. 最常用的是,Screen建立一個自定義名稱的窗口會話
[sjy@xxx ~]$ screen -R myname
screen常用選項及示例
-d <作業名稱> 將指定的screen作業離線。
-r <作業名稱> 恢復離線的screen作業。
-R 先試圖恢復離線的作業。若找不到離線的作業,即建立新的screen作業。
-s 指定建立新視窗時,所要執行的shell。
-S <作業名稱> 指定screen作業的名稱。
-v 顯示版本信息。
-x 恢復之前離線的screen作業。
-ls或--list 顯示目前所有的screen作業。
-wipe 檢查目前所有的screen作業,並刪除已經無法使用的screen作業。
screen -S yourname -> 新建一個叫yourname的session
screen -ls -> 列出當前所有的session
screen -r yourname -> 回到yourname這個session
screen -d yourname -> 遠程detach某個session
screen -XS yourname quit -> 刪除yourname這個detached的session(wipe刪不掉的)
給screen窗口發送的常用命令【C-a是Ctrl+A的快捷鍵】
C-a c -> 創建一個新的運行shell的窗口並切換到該窗口
C-a n -> Next,切換到下一個 window
C-a p -> Previous,切換到前一個 window
C-a d -> detach,暫時離開當前session,將目前的 screen session (可能含有多個 windows) 丟到後臺執行,並會回到還沒進 screen 時的狀態,此時在 screen session 裏,每個 window 內運行的 process (無論是前臺/後臺)都在繼續執行,即使 logout 也不影響。
C-a k -> kill window,強行關閉當前的 window
SIGHUP 信號:爲什麼關掉窗口/斷開連接會使得正在運行的遠端程序死掉
在Linux/Unix中,有這樣幾個概念:
· 進程組(process group):一個或多個進程的集合,每一個進程組有唯一一個進程組ID,即進程組長進程的ID。
· 會話期(session):一個或多個進程組的集合,有唯一一個會話期首進程(session leader)。會話期ID爲首進程的ID。
會話期可以有一個單獨的控制終端。與控制終端連接的會話期首進程叫做控制進程。當前與終端交互的進程稱爲前臺進程組。其餘進程組稱爲後臺進程組。
掛斷信號(SIGHUP)默認的動作是終止程序。當終端接口檢測到網絡連接斷開,將掛斷信號發送給控制進程(會話期首進程)。如果會話期首進程終止,則該信號發送到該會話期前臺進程組。一個進程退出導致一個孤兒進程組中產生時,如果任意一個孤兒進程組進程處於STOP狀態,發送SIGHUP和SIGCONT信號到該進程組中所有進程。
因此當網絡斷開或終端窗口關閉後,控制進程收到SIGHUP信號退出,會導致該會話期內其他進程退出。
tee命令
說明:tee命令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。參數: -a 或 --append 附加到既有文件的後面,而非覆蓋它。
-i-i 或 --ignore-interrupts 忽略中斷信號。
--version 顯示版本信息。
[sjy@xxx ~]$pwd | tee a.out
/home/sjy
[sjy@xxx ~]$cat a.out
/home/sjy
創建一個視窗用於在後臺執行程序,並將打印到視窗屏幕上的內容保存成文件,供後期查看。
[sjy@xxx ~]screen -S mysession | ./myprogram.sh | tee myprogram.log