GNU-Bildschirm - Nach einer unterbrochenen Verbindung kann keine erneute Verbindung zum Bildschirm hergestellt werden


23

Ich habe irssi auf dem Bildschirm verwendet, aber die Verbindung wurde unterbrochen. Nachdem ich wieder auf den Server zurückgeschaltet habe, kann ich keine Verbindung mehr zu diesem Bildschirm herstellen. screen -ls zeigt an, dass der Bildschirm bereits angehängt ist.

Ich habe versucht, screen -D zu aktivieren, um das Entfernen zu erzwingen, und es heißt detach, aber screen -ls sagt immer noch, es sei angehängt. Ich habe screen -x ausprobiert und es hängt einfach da.

[sub@server ~]$ screen -ls 
There are screens on:
 4033.poe (Detached)
 7728.irssi (Attached)
2 Sockets in /var/run/screen/S-sub.

Was kann ich jetzt machen?

Antworten:


14

Wenn Sie versuchen, den Bildschirm "Attached" (Angeschlossen) zu verbinden, führen Sie den Befehl aus screen -xr irssi. Der Großbuchstabe '-X' sendet einen Befehl an eine der Bildschirmsitzungen. Mit der Option '-x' in Kleinbuchstaben können Sie die Verbindung zu einer angehängten Sitzung wiederherstellen. Sie müssen den Sitzungsnamen jedoch noch angeben, da es mehrere gibt.


9

Ich habe dieses Verhalten in der Vergangenheit behoben , indem ich die Shell beendet habe , die die Bildschirmsitzung gestartet hat. Im Grunde alle Bash-Instanzen für meinen Benutzer beenden, die nicht im Besitz von screen waren.


2
Versuchte alle hier genannten Optionen (-RD, -xr) und konnte die Sitzung nicht wiederherstellen. Beendete die SCREEN-Sitzung, indem sie gefunden wurde (ps -ef | grep bash).
so_mv

4

Sie haben ihm einen nicht standardmäßigen Namen gegeben. Versuche dies:screen -RD irssi


2
Ich habe ein ähnliches Problem, aber Bildschirm -RD <Name> hängt noch ... :-(
Harald

4

Du kannst es versuchen:

#Reattach a session and if necessary detach it first.
screen -d -r 7728.irssi  

#Reattach a session. If necessary detach and logout remotely first.
screen -D -r 7728.irssi

Es ist immer eine gute Idee, den vollständigen Namen zu verwenden pid.tty


3

screenist dafür bekannt, dass es zwischen Versionen nicht abwärtskompatibel ist. Wenn die Version von screenauf dem Server aktualisiert wurde, ist es möglich, dass Sie keine Verbindung mehr zu älteren Bildschirmsitzungen herstellen können.

In diesem Fall können Sie entweder die alte SCREEN-Binärdatei zum erneuten Anschließen verwenden (vorausgesetzt, Ihr Distributionspaket-Manager hat sie irgendwo gespeichert) oder die Sitzung vollständig beenden.


2

Ich hatte einige Erfolge, als ich dem GNU / screen-Prozess eine SIGCHLD sendete (die normalerweise beim Schließen eines Fensters empfangen wird). Dadurch wird er gezwungen, die Socket-Datei zu berühren (und möglicherweise neu zu erstellen).

Beachten Sie auch, dass es zwei Möglichkeiten gibt, um die screenausführbare Datei aufzurufen, die sich nur für den Fall unterscheiden: SCREENIst die serverseitige Komponente, zu der Sie erneut eine Verbindung herstellen möchten, und screenist die clientseitige Komponente , die Daten zwischen Ihrem Terminal und der serverseitigen Komponente mischt. Vielleicht möchten Sie versuchen, die Kleinbuchstaben-Version zu töten ...

Im Folgenden sehen Sie beispielsweise, dass meine screenund SCREENProzesse nicht als übergeordnet und untergeordnet betrachtet werden, was darauf hinweist, dass ich einer vorhandenen Sitzung angehängt habe.

# ps fao pid,command
25070 SCREEN -U
25071  \_ vim +let &t_Co=256
25073  \_ -bash
25077  \_ -bash
...
18364  \_ sshd: username [priv]
18366  |   \_ sshd: username@pts/17
18367  |       \_ -bash
  870  |           \_ screen -U -x

Neue Sessions sehen ungefähr so ​​aus:

19645  |  \_ screen -S MySession
19646  |      \_ SCREEN -S MySession
19647  |          \_ bash
 1485  |          |   \_ python
19700  |          \_ bash

Wie sende ich ein SIGCHILD?
Giorgio79

1
Verwenden Sie den beängstigend benannten killBefehl wie folgt : kill -s SIGCHLD <PID>Wo <PID>ist die Prozess-ID-Nummer (linke Spalte in meiner Beispielausgabe)
RobM

1

Dies passierte mir, während ich vi verwendete, wo die Sitzung erstarrte und ich die Verbindung abbrach. Bei dem Versuch, mit screen -Arx erneut eine Verbindung zum Bildschirm herzustellen, blieb der Prozess einfach hängen.

Möglicherweise wird ein ähnlicher untergeordneter Prozess ausgeführt, wodurch der Bildschirm hängen bleibt. Wenn Sie sich an einen erinnern, der sich speziell darauf konzentriert, gehen Sie folgendermaßen vor, um eine Liste der untergeordneten Prozesse zu erhalten, die unter Ihrem Bildschirm ausgeführt werden:

ps ux -H

Welche zeigt die verschachtelten untergeordneten Prozesse:

zwood    28481  0.0  0.0 101148  8844 ?        Ss   Oct07   1:36 SCREEN -S mysession
zwood    28482  0.0  0.0  67436  1744 pts/2    Ss+  Oct07   0:00   /bin/bash
zwood    28515  0.0  0.0  67556  1876 pts/4    Ss+  Oct07   0:00   /bin/bash
zwood     4498  0.0  0.0  67436  1772 pts/5    Ss   Oct07   0:00   /bin/bash
zwood     2007  0.0  0.0  73604  1324 pts/5    S+   15:47   0:00     vi /home/zwood/.bashrc.custom
zwood    14670  0.0  0.0  67436  1768 pts/13   Ss+  Oct14   0:00   /bin/bash
zwood    27002  0.0  0.0  67436  1720 pts/11   Ss+  Oct20   0:00   /bin/bash
zwood    24748  0.0  0.0  67432  1712 pts/14   Ss+  Oct21   0:00   /bin/bash

Nachdem ich den vi-Prozess beendet hatte, der das Problem verursacht hatte, konnte ich den Bildschirm ohne Probleme wieder anbringen. Es ist wahrscheinlich auch eine gute Idee, alle vorherigen Prozesse zu beenden, die wieder mit dem Bildschirm verbunden waren. Benutz einfach:

kill -9 <pid>

Ich weiß nicht, was der Bildschirm intern macht, warum vi den Bildschirm zum Stillstand brachte oder warum das Beenden des vi-Prozesses meinen Bildschirm zurückbrachte. Ich bin in der Vergangenheit auf dieses Problem mit dem Bildschirm gestoßen und habe versucht, was die meisten Leute in diesem Thread ohne Glück empfehlen. Das Finden dieses Problemkindprozesses ist das einzige, was für mich funktioniert hat und dabei konsequent gearbeitet hat.


Das Einzige, was mich rettete, war ein Amoklauf von Prozessen unter dem Bildschirm. Ich würde lieber viele Prozesse unter dem Bildschirm verlieren, als die gesamte Bildschirmsitzung zu verlieren!
Yonatan


0
killall -9 sshd

Es hat bei mir funktioniert. Ich hatte 3 verschiedene Bildschirme und habe 3 verschiedene SSH-Verbindungen verloren. Nach dem erneuten Herstellen der Verbindung waren die Bildschirme noch angeschlossen. Ich habe den obigen Befehl ausgegeben. Natürlich habe ich meine aktuelle Verbindung verloren, aber es war eine neue. Beim nächsten Wiederverbinden wurden alle Bildschirme getrennt.

Wenn Sie ein Superuser sind, sollten Sie die --userOption verwenden, um nur Ihre ssh-Daemons zu töten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.