目錄
元兇:SIGHUP 訊號
開始使用Screen
暂时中断会话
Screen常用选项
Screen 常用选项
自定义命令字符和转义字符
管理你的远程会话
putty
telnet
更多Screen功能
首頁 web前端 js教程 linux使用screen管理遠端會話實例方法

linux使用screen管理遠端會話實例方法

Mar 13, 2018 pm 03:14 PM
linux screen 遠端

你經常需要 SSH 或 telent 遠端登入 Linux 伺服器?你是否常常為一些長時間運行的任務而頭疼,例如係統備份、ftp 傳輸等等。通常情況下我們都是為每一個這樣的任務開一個遠端終端窗口,因為他們執行的時間太長了。必須等待它執行完畢,在此期間可不能關掉視窗或斷開連接,否則這個任務就會被殺掉,一切半途而廢了。

元兇:SIGHUP 訊號

讓我們來看看為什麼關掉視窗/斷開連線會讓正在執行的程式死掉。

在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     5180 S        0   0:00 -bash
 5128  5180  5180  5128 pts/0     5180 S        0   0:50 top
 3672 18095 18094  3672 pts/2    18094 S        0   0:00 grep 5128
登入後複製

關閉第一個SSH窗口,在另一個視窗中可以看到top也被殺掉了。

[root@tivf09 root]# ps -ef|grep 5128
root     18699  3672  0 04:35 pts/2    00:00:00 grep 5128
登入後複製

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

nohup <command> [argument…] &
登入後複製

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

其實我們可以使用一個更強大的實用程式screen。受歡迎的Linux發行版(例如Red Hat Enterprise Linux 4)通常會自帶screen實用程序,如果沒有的話,可以從GNU screen的官方網站下載。

[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視窗中程式的運作而暫時斷開(detach)screen會話,並在隨後時間重新連線(attach)該會話,重新控制各視窗中執行的程式。例如,我們打開一個screen視窗編輯/tmp/abc檔:

[root@tivf06 ~]# screen vi /tmp/abc
登入後複製

之後我們想暫時退出做點別的事情,例如出去散散步,那麼在screen視窗鍵入C-a d,Screen會給出detached提示:

暂时中断会话

半个小时之后回来了,找到该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)。

可以通过C-a ?来查看所有的键绑定,常用的键绑定有:

C-a ?显示所有键绑定信息
C-a w显示所有窗口列表
C-a C-a切换到之前显示的窗口
C-a c创建一个新的运行shell的窗口并切换到该窗口
C-a n切换到下一个窗口
C-a p切换到前一个窗口(与C-a n相对)
C-a 0..9切换到窗口0..9
C-a a发送 C-a到当前窗口
C-a d暂时断开screen会话
C-a k杀掉当前窗口
C-a [进入拷贝/回滚模式

Screen常用选项

使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:

Screen 常用选项

因为screen把C-a看作是screen命令的开始,所以如果你想要screen窗口接收到C-a字符,就要输入C-a a。Screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:

-exy x为命令字符,y为转义命令字符的字符

下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t ?命令可以看到该变化。

[root@tivf18 root]# screen -e^tt
登入後複製
自定义命令字符和转义字符

其他常用的命令选项有:

-c file使用配置文件file,而不使用默认的$HOME/.screenrc
-d|-D [pid.tty.host]不开启新的screen会话,而是断开其他正在运行的screen会话
-h num指定历史回滚缓冲区大小为num行
-list|-ls列出现有screen会话,格式为pid.tty.host
-d -m启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host]重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname创建screen会话时为会话指定一个名字
-v显示screen版本信息
-wipe [match]同-list,但删掉那些无法连接的会话

下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r 重新连接上:

[root@tivf18 root]# screen –ls
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Detached)
2 Sockets in /root/.screen.

[root@tivf18 root]# screen –r 8736
登入後複製

如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

[root@tivf18 root]# kill -9 8462
[root@tivf18 root]# screen -ls  
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Dead ???)
Remove dead screens with &#39;screen -wipe&#39;.
2 Sockets in /root/.screen.

[root@tivf18 root]# screen -wipe
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Removed)
1 socket wiped out.
1 Socket in /root/.screen.

[root@tivf18 root]# screen -ls  
There is a screen on:
        8736.pts-1.tivf18       (Detached)
1 Socket in /root/.screen.

[root@tivf18 root]#
登入後複製

-d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname

启动一个初始状态断开的screen会话:

[root@tivf06 tianq]# screen -dmS mygdb gdb execlp_test
登入後複製

连接该会话:

[root@tivf06 tianq]# screen -r mygdb
登入後複製

管理你的远程会话

先来看看如何使用screen解决SIGHUP问题,比如现在我们要ftp传输一个大文件。如果按老的办法,SSH登录到系统,直接ftp命令开始传输,之后。。如果网络速度还可以,恭喜你,不用等太长时间了;如果网络不好,老老实实等着吧,只能传输完毕再断开SSH连接了。让我们使用screen来试试。

SSH登录到系统,在命令行键入screen。

[root@tivf18 root]# screen
登入後複製

在screen shell窗口中输入ftp命令,登录,开始传输。不愿意等了?OK,在窗口中键入C-a d:

管理你的远程会话

然后。。退出SSH登录?随你怎样,只要别杀掉screen会话。

是不是很方便?更进一步,其实我们可以利用screen这种功能来管理你的远程会话,保存你所有的工作内容。你是不是每次登录到系统都要开很多窗口,然后每天都要重复打开关闭这些窗口?让screen来帮你“保存”吧,你只需要打开一个ssh窗口,创建需要的screen窗口,退出的时候C-a d“保存”你的工作,下次登录后直接screen -r 就可以了。

最好能给每个窗口起一个名字,这样好记些。使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字,可能名字出现的位置不同。使用putty:

putty

使用telnet:

telnet


更多Screen功能

Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。

以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。

以上是linux使用screen管理遠端會話實例方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

vscode 無法安裝擴展 vscode 無法安裝擴展 Apr 15, 2025 pm 07:18 PM

VS Code擴展安裝失敗的原因可能包括:網絡不穩定、權限不足、系統兼容性問題、VS Code版本過舊、殺毒軟件或防火牆干擾。通過檢查網絡連接、權限、日誌文件、更新VS Code、禁用安全軟件以及重啟VS Code或計算機,可以逐步排查和解決問題。

VSCode怎麼用 VSCode怎麼用 Apr 15, 2025 pm 11:21 PM

Visual Studio Code (VSCode) 是一款跨平台、開源且免費的代碼編輯器,由微軟開發。它以輕量、可擴展性和對眾多編程語言的支持而著稱。要安裝 VSCode,請訪問官方網站下載並運行安裝程序。使用 VSCode 時,可以創建新項目、編輯代碼、調試代碼、導航項目、擴展 VSCode 和管理設置。 VSCode 適用於 Windows、macOS 和 Linux,支持多種編程語言,並通過 Marketplace 提供各種擴展。它的優勢包括輕量、可擴展性、廣泛的語言支持、豐富的功能和版

vscode 可以用於 mac 嗎 vscode 可以用於 mac 嗎 Apr 15, 2025 pm 07:36 PM

VS Code 可以在 Mac 上使用。它具有強大的擴展功能、Git 集成、終端和調試器,同時還提供了豐富的設置選項。但是,對於特別大型項目或專業性較強的開發,VS Code 可能會有性能或功能限制。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

Linux的主要目的是什麼? Linux的主要目的是什麼? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

See all articles