回覆列表
  • 1 # 狗旦345

    在Linux/Unix中,有這樣幾個概念:

    程序組(process group):一個或多個程序的集合,每一個程序組有唯一一個程序組ID,即程序組長程序的ID。

    會話期(session):一個或多個程序組的集合,有唯一一個會話期首程序(session leader)。會話期ID為首程序的ID。

    會話期可以有一個單獨的控制終端(controlling terminal)。與控制終端連線的會話期首程序叫做控制程序(controlling process)。當前與終端互動的程序稱為前臺程序組。其餘程序組稱為後臺程序組。

    根據POSIX.1定義:

    結束通話訊號(SIGHUP)預設的動作是終止程式。

    當終端介面檢測到網路連線斷開,將結束通話訊號傳送給控制程序(會話期首程序)。

    如果會話期首程序終止,則該訊號傳送到該會話期前臺程序組。

    一個程序退出導致一個孤兒程序組中產生時,如果任意一個孤兒程序組程序處於STOP狀態,傳送SIGHUP和SIGCONT訊號到該程序組中所有程序。

    因此當網路斷開或終端視窗關閉後,控制程序收到SIGHUP訊號退出,會導致該會話期內其他程序退出。

    我們來看一個例子。開啟兩個SSH終端視窗,在其中一個執行top命令。

    [root@tivf09 root]# top

    在另一個終端視窗,找到top的程序ID為5180,其父程序ID為5128,即登入shell。

    [root@tivf09 root]# ps -ef|grep top

    root 5180 5128 0 01:03 pts/0 00:00:02 top

    root 5857 3672 0 01:12 pts/2 00:00:00 grep top

    使用pstree命令可以更清楚地看到這個關係:

    [root@tivf09 root]# pstree -H 5180|grep top

    |-sshd-+-sshd---bash---top

    使用ps-xj命令可以看到,登入shell(PID 5128)和top在同一個會話期,shell為會話期首程序,所在程序組PGID為5128,top所在程序組PGID為5180,為前臺程序組。

    [root@tivf09 root]# ps -xj|grep 5128

    5126 5128 5128 5128 pts/0

    如果我們可以忽略SIGHUP訊號,關掉視窗應該就不會影響程式的運行了。nohup命令可以達到這個目的,如果程式的標準輸出/標準錯誤是終端,nohup預設將其重定向到nohup.out檔案。值得注意的是nohup命令只是使得程式忽略SIGHUP訊號,還需要使用標記&把它放在後臺執行。

    nohup <command> [argument…] &

    雖然nohup很容易使用,但還是比較“簡陋”的,對於簡單的命令能夠應付過來,對於複雜的需要人機互動的任務就麻煩了。

    [root@tivf06 ~]# rpm -qa|grep screen

    xscreensaver-4.18-5.rhel4.11

    screen-4.0.2-5

    開始使用Screen

    簡單來說,Screen是一個可以在多個程序之間多路複用一個物理終端的視窗管理器。Screen中有會話的概念,使用者可以在一個screen會話中建立多個screen視窗,在每一個screen視窗中就像操作一個真實的telnet/SSH連線視窗那樣。在screen中建立一個新的視窗有這樣幾種方式:

    1.直接在命令列鍵入screen命令

    [root@tivf06 ~]# screen

    Screen將建立一個執行shell的全屏視窗。你可以執行任意shell程式,就像在ssh視窗中那樣。在該視窗中鍵入exit退出該視窗,如果這是該screen會話的唯一視窗,該screen會話退出,否則screen自動切換到前一個視窗。

    2.Screen命令後跟你要執行的程式。

    [root@tivf06 ~]# screen vi test.c

    Screen建立一個執行vi test.c的單視窗會話,退出vi將退出該視窗/會話。

    3.以上兩種方式都建立新的screen會話。我們還可以在一個已有screen會話中建立新的視窗。在當前screen視窗中鍵入C-a c,即Ctrl鍵+a鍵,之後再按下c鍵,screen 在該會話內生成一個新的視窗並切換到該視窗。

    screen還有更高階的功能。你可以不中斷screen視窗中程式的執行

    半個小時之後回來了,找到該screen會話:

    [root@tivf06 ~]# screen -ls

    There is a screen on:

    16582.pts-1.tivf06 (Detached)

    1 Socket in /tmp/screens/S-root.

    重新連線會話:

    [root@tivf06 ~]# screen -r 16582

    看看出現什麼了,太棒了,一切都在。繼續幹吧。

    你可能注意到給screen傳送命令使用了特殊的鍵組合C-a。這是因為我們在鍵盤上鍵入的資訊是直接傳送給當前screen視窗,必須用其他方式向screen視窗管理器發出命令,預設情況下,screen接收以C-a開始的命令。這種命令形式在screen中叫做鍵繫結(key binding),C-a叫做命令字元(command character)。

  • 中秋節和大豐收的關聯?
  • 海爾藍鑽滾筒洗衣機怎麼使用?