你是否常常需要SSH或者telent來遠端連接配接Linux伺服器? 你是否對一些運作時間漫長的任務,諸如系統備份, FTP傳輸,感到身心俱疲. 由于它們的執行時間漫長,我們常常是針對這些任務中的每一個都打開一個終端界面. 你不得不等待期執行結束, 這期間不能關閉終端,或者斷開連接配接, 否則這個任務就會被終止。
當連接配接的網絡處在斷開狀态,或者終端視窗被關閉時, 控制程序會從其它程序那裡收到 SIGHUP 信号, 然後程序就會在會話的過程中退出執行。
讓我們來看看下面這個SIGHUP信号終止程序的示例:
打開兩個 SSH 終端并在其一中運作 'top' 指令
[root@devops ~]# top
top - 21:44:55 up 159 days, 4:09, 2 users, load average: 0.11, 0.03, 0.01
Tasks: 65 total, 1 running, 64 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 500832k total, 480212k used, 20620k free, 2048k buffers
Swap: 0k total, 0k used, 0k free, 41496k cached
在另一個終端中擷取到top的程序ID為8535,它的父ID是8520.
[root@devops ~]# ps -ef | grep top
root 8535 8520 0 21:44 pts/1 00:00:00 top
root 8537 8503 0 21:46 pts/0 00:00:00 grep top
[root@devops ~]#
使用pstree指令來看清楚它們的關系 :
[root@devops ~]# pstree -H 8535| grep top
| `-sshd---bash---top
我們可以從 'ps -xj' 指令的輸出中獲得資訊,知道 'bash shell' 和 'top' 程序處在同一個會話期 , 它們的父 ID 是 8520 .
[root@devops ~]# ps -xj|grep 8520
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
8518 8520 8520 8520 pts/1 8535 Ss 0 0:00 -bash
8520 8535 8535 8520 pts/1 8535 S+ 0 0:00 top
8503 8542 8541 8503 pts/0 8541 S+ 0 0:00 grep 8520
現在關閉第一個終端,并在另外一個終端裡檢查程序的資訊。已經沒有任何top的程序了,這表明top程序已經被終止了.
[root@devops ~]# ps -ef | grep 8535
root 8547 8503 0 21:51 pts/0 00:00:00 grep 8535
如果我們可以忽略 SIGHUP 信号, 終端的關閉就不會影響到程式的運作. nohup 指令可以做到, 如果标準的輸出和标準的錯誤輸出是終端的話 , 那麼 nohup 預設會将輸出重定向到 nohup.out 檔案. 請注意nohup 指令的作用是使得程式忽略 SIGHUP 信号, 但也需要使用 & 符号使其在背景運作.
nohup <command> [argument…] &
盡管 nohup 使用起來很容易, 但它仍然是相對來說 '簡單'的, 它隻能處理簡單的指令, 在人機界面環境下處理複雜的任務時還是會有麻煩的。
如何使用 Screen 指令?
事實上,我們可以使用更加有用的工具—— 'screen'. 你可以使用下面的yum指令安裝screen :
#yum install screen
使用者可以在一個screen會話中建立多個screen視窗, 每一個 screen 視窗都是一個真的 telnet/SSH 連結視窗. 有多中方法可以建立一個screen會話 :
1. 輸入如下指令:
[root@devops ~]# screen
Screen 将會建立一個帶有全屏視窗的shell. 你可以執行任何shell程式,就跟在SSH視窗中一樣. 如果你想退出會話,隻要輸入‘exit'指令就行了. 如果screen會話中隻有一個視窗, 關閉這個視窗的話screen會話就會退出, 其它情況下 screen 會自動切換到前一個會話。
2. 輸入Screen指令和你想要執行的程式
[root@devops ~]# screen top
Screen有更多進階的功能。你不需要為了控制screen中的程式,而終止screen任務中的程式,暫時斷開(分離)screen程序,再次重新連接配接screen程序。
你可以使用'Ctrl'+'a'+'d'來分離目前screen程序,使用'screen -r sessionID'來重新連接配接screen程序。
[detached]
[root@devops ~]# screen -ls
There is a screen on:
11048.pts-0.devops (Detached)
1 Socket in /var/run/screen/S-root.
[root@devops ~]# screen -r 11048
如果你想知道更多screen指令的幫助資訊,使用'ctrl'+'a'+'?':
