Linux:使用 screen 命令來管理遠程登錄會話

jopen 10年前發布 | 11K 次閱讀 Linux

你是否常常需要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'+'?':

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!