Heim  >  Artikel  >  Web-Frontend  >  Linux verwendet den Bildschirm, um Remote-Sitzungsinstanzmethoden zu verwalten

Linux verwendet den Bildschirm, um Remote-Sitzungsinstanzmethoden zu verwalten

小云云
小云云Original
2018-03-13 15:14:481302Durchsuche

Benötigen Sie häufig SSH oder Telent, um sich remote bei einem Linux-Server anzumelden? Haben Sie häufig Probleme mit langwierigen Aufgaben wie Systemsicherung, FTP-Übertragung usw.? Normalerweise öffnen wir für jede dieser Aufgaben ein Remote-Terminal-Fenster, da die Ausführung zu lange dauert. Sie müssen warten, bis die Ausführung abgeschlossen ist. Während dieser Zeit können Sie das Fenster nicht schließen oder die Verbindung trennen, da sonst die Aufgabe abgebrochen wird und alles auf halbem Weg abgebrochen wird.

Der Übeltäter: SIGHUP-Signal

Lassen Sie uns einen Blick darauf werfen, warum das Schließen des Fensters/Trennen der Verbindung dazu führt, dass das laufende Programm abstürzt.

Unter Linux/Unix gibt es mehrere Konzepte:

  • Prozessgruppe (Prozessgruppe): eine Sammlung von einem oder mehreren Prozessen, jede Prozessgruppe hat den einzigen Prozess Gruppen-ID, die die ID des Prozessleiterprozesses ist.

  • Sitzung: Eine Sammlung einer oder mehrerer Prozessgruppen mit einem eindeutigen Sitzungsleiter. Die Sitzungs-ID ist die ID des ersten Prozesses.

  • Eine Sitzung kann ein separates Steuerungsterminal haben. Der erste Prozess der Sitzung, der mit dem steuernden Terminal verbunden ist, wird als steuernder Prozess bezeichnet. Der Prozess, der aktuell mit dem Terminal interagiert, wird als Vordergrundprozessgruppe bezeichnet. Die übrigen Prozessgruppen werden Hintergrundprozessgruppen genannt.

Gemäß POSIX.1-Definition:

  • Die Standardaktion des Auflegesignals (SIGHUP) besteht darin, das Programm zu beenden.

  • Wenn die Terminalschnittstelle erkennt, dass die Netzwerkverbindung getrennt ist, sendet sie ein Auflegesignal an den Steuerungsprozess (den ersten Prozess der Sitzung).

  • Wenn der Sitzungskopfprozess beendet wird, wird dieses Signal an die Sitzungsvordergrundprozessgruppe gesendet.

  • Wenn ein Prozess beendet und eine verwaiste Prozessgruppe erstellt wird und sich ein verwaister Prozessgruppenprozess im STOP-Zustand befindet, werden SIGHUP- und SIGCONT-Signale an alle Prozesse in der Prozessgruppe gesendet.

Wenn daher die Netzwerkverbindung getrennt oder das Terminalfenster geschlossen wird, empfängt der Steuerungsprozess das SIGHUP-Signal und wird beendet, was dazu führt, dass andere Prozesse in der Sitzung beendet werden.

Schauen wir uns ein Beispiel an. Öffnen Sie zwei SSH-Terminalfenster und führen Sie in einem davon den oberen Befehl aus.

[root@tivf09 root]# top

Suchen Sie in einem anderen Terminalfenster die Prozess-ID von top als 5180 und die ID des übergeordneten Prozesses ist 5128, bei der es sich um die Anmeldeshell handelt.

[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

Verwenden Sie den Befehl pstree, um diese Beziehung klarer zu sehen:

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

Verwenden Sie den Befehl ps-xj, um zu sehen, dass sich die Login-Shell (PID 5128) und top im befinden gleich Während der Sitzung ist Shell der erste Prozess in der Sitzung und seine Prozessgruppen-PGID ist 5128. Die Prozessgruppen-PGID von Top ist 5180, die Vordergrundprozessgruppe.

[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

Schließen Sie das erste SSH-Fenster und Sie können in einem anderen Fenster sehen, dass auch top getötet wurde.

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

Wenn wir das SIGHUP-Signal ignorieren können, sollte das Schließen des Fensters keinen Einfluss auf die Ausführung des Programms haben. Der Befehl nohup kann diesen Zweck erreichen. Wenn die Standardausgabe/der Standardfehler des Programms das Terminal ist, leitet nohup es standardmäßig in die Datei nohup.out um. Es ist zu beachten, dass der Befehl nohup nur dazu führt, dass das Programm das SIGHUP-Signal ignoriert. Sie müssen auch die Markierung & verwenden, um es im Hintergrund auszuführen.

nohup e2b9f03cad787b9644e1f51fd23b7dac [argument…] &

Obwohl Nohup einfach zu bedienen ist, ist es immer noch relativ „grob“. Es kann einfache Befehle verarbeiten, ist jedoch bei komplexen Aufgaben, die eine Mensch-Computer-Interaktion erfordern, mühsam.

Tatsächlich können wir einen leistungsfähigeren Utility-Bildschirm verwenden. Beliebte Linux-Distributionen (wie Red Hat Enterprise Linux 4) enthalten normalerweise das Dienstprogramm screen. Wenn nicht, können Sie es von der offiziellen GNU-Screen-Website herunterladen.

[root@tivf06 ~]# rpm -qa|grep screen
xscreensaver-4.18-5.rhel4.11
screen-4.0.2-5

Starten Sie mit der Verwendung von Screen

Einfach ausgedrückt ist Screen ein Fenstermanager, der ein physisches Terminal zwischen mehreren Prozessen multiplexen kann. Der Bildschirm basiert auf dem Sitzungskonzept. Benutzer können in einer Bildschirmsitzung mehrere Bildschirmfenster erstellen, und jedes Bildschirmfenster funktioniert wie ein echtes Telnet/SSH-Verbindungsfenster. Es gibt mehrere Möglichkeiten, ein neues Fenster im Bildschirm zu erstellen:

1. Geben Sie den Bildschirmbefehl

[root@tivf06 ~]# screen

Screen direkt in der Befehlszeile ein, um ein Vollbildfenster zum Ausführen der Shell zu erstellen. Sie können beliebige Shell-Programme wie in einem SSH-Fenster ausführen. Geben Sie „exit“ in das Fenster ein, um das Fenster zu verlassen. Wenn dies das einzige Fenster für die Bildschirmsitzung ist, wird die Bildschirmsitzung beendet, andernfalls wechselt der Bildschirm automatisch zum vorherigen Fenster.

2. Auf den Screen-Befehl folgt das Programm, das Sie ausführen möchten.

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

Screen erstellt eine Einzelfenstersitzung, die vi test.c ausführt. Durch Beenden von vi wird das Fenster/die Sitzung beendet.

3. Beide oben genannten Methoden erstellen eine neue Bildschirmsitzung. Wir können auch neue Fenster innerhalb einer bestehenden Bildschirmsitzung erstellen. Geben Sie C-a c in das aktuelle Bildschirmfenster ein, d. h. Strg-Taste + A-Taste, und drücken Sie dann die C-Taste, um den Bildschirm anzuzeigen Erstellen Sie innerhalb der Sitzung ein neues Fenster und wechseln Sie dorthin.

Bildschirm verfügt auch über erweiterte Funktionen. Sie können die Bildschirmsitzung vorübergehend trennen (trennen), ohne die Ausführung des Programms im Bildschirmfenster zu unterbrechen, und die Sitzung zu einem späteren Zeitpunkt wieder verbinden (anhängen), um die Kontrolle über die in jedem Fenster ausgeführten Programme wiederzugewinnen. Zum Beispiel öffnen wir ein Bildschirmfenster, um die Datei /tmp/abc zu bearbeiten:

[root@tivf06 ~]# screen vi /tmp/abc

Dann möchten wir vorübergehend beenden und etwas anderes tun, beispielsweise spazieren gehen, und geben dann C-a d ein Bildschirmfenster, und der Bildschirm gibt eine getrennte Eingabeaufforderung aus:

暂时中断会话

半个小时之后回来了,找到该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 06e838b839169df1cfa03248ef419f73重新连接上:

[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 'screen -wipe'.
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 06e838b839169df1cfa03248ef419f73就可以了。

最好能给每个窗口起一个名字,这样好记些。使用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页。

Das obige ist der detaillierte Inhalt vonLinux verwendet den Bildschirm, um Remote-Sitzungsinstanzmethoden zu verwalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn