Linux:使用 screen 命令來管理遠程登錄會話
你是否常常需要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 [root@devops ~]#
我們可以從 '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 [root@devops ~]#
如果我們可以忽略 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進程。
[root@devops ~]# screen top [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'+'?':