GNU-Bildschirm reagiert nicht mehr und versucht, erneut eine Verbindung herzustellen

16

Ich habe mehrere lange laufende GNU-Bildschirmsitzungen. Ich gehe zu der Box, auf der sie laufen und starte screen -d -r foo, um sie zu entfernen, wenn sie irgendwo anders verbunden sind, und hänge sie dann in meinem aktuellen Fenster an.

In 99% der Fälle funktioniert dies einwandfrei, aber gelegentlich erhalte ich Folgendes:

$ screen -d -r foo
[2430.foo detached.]

... und nichts passiert; Ich kann überhaupt nicht zur Muschel zurückkehren. Wenn ich in einem anderen Fenster versuche, funktioniert es genauso. Ich kann nur diese Bildschirmsitzung zerstören (alle darin ausgeführten Programme verlieren) und neu erstellen

Warum passiert das? Wie kann ich das vermeiden oder die Verbindung wiederherstellen, wenn es passiert?


Bearbeiten : Meine .screenrc:

startup_message off
defwritelock off
bind q quit
caption always '%{gk}   (%n) %t                   %{y}%d %M %Y :: %c:%s                   %{b}%W%{d}'
screen -t ZSH
autodetach on
shelltitle ZSH
defutf8 on

Bearbeiten : Das Ende eines straceProtokolls, wenn versucht wird, Folgendes anzuhängen:

readlink("/proc/self/fd/0", "/dev/pts/14", 4095) = 11
stat64("/dev/pts/14", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 14), ...}) = 0
stat64("/dev/pts/14", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 14), ...}) = 0
geteuid32()                             = 1000
getegid32()                             = 1000
open("/dev/pts/14", O_RDWR|O_NONBLOCK)  = 3
geteuid32()                             = 1000
getegid32()                             = 1000
close(3)                                = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
umask(0)                                = 022
lstat64("/var/run/screen", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
access("/var/run/screen/S-mrozekma", F_OK) = 0
stat64("/var/run/screen/S-mrozekma", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
umask(022)                              = 0
uname({sys="Linux", node="etudes-2", ...}) = 0
rt_sigaction(SIGHUP, {0x806e520, [], 0}, {SIG_DFL, [], 0}, 8) = 0
geteuid32()                             = 1000
getegid32()                             = 1000
open("/var/run/screen/S-mrozekma", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 6 entries */, 32768)     = 124
stat64("/var/run/screen/S-mrozekma/2386.chat", {st_mode=S_IFIFO|0700, st_size=0, ...}) = 0
geteuid32()                             = 1000
getegid32()                             = 1000
open("/var/run/screen/S-mrozekma/2386.chat", O_WRONLY|O_NONBLOCK) = 4
geteuid32()                             = 1000
getegid32()                             = 1000
fcntl64(4, F_SETFL, O_RDONLY)           = 0
geteuid32()                             = 1000
getegid32()                             = 1000
getdents(3, /* 0 entries */, 32768)     = 0
close(3)                                = 0
geteuid32()                             = 1000
getegid32()                             = 1000
setuid32(1000)                          = 0
setgid32(1000)                          = 0
stat64("/var/run/screen/S-mrozekma/2386.chat", {st_mode=S_IFIFO|0700, st_size=0, ...}) = 0
getpid()                                = 30081
write(4, "\0gsm\4\0\0\0/dev/pts/14\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 12336
Michael Mrozek
quelle
Das Posten von ~ / .screenrc (und möglicherweise / etc / screenrc, wenn es angepasst wurde) könnte hilfreich sein
user2387
Bitte posten Sie die Ausgabe von strace screen -d -r foo(möglicherweise müssen Sie eine nicht festgelegte [ug] -ID-Kopie der screenausführbaren Datei erstellen) und strace -p$(pidof SCREEN)ungefähr zum Zeitpunkt einer fehlgeschlagenen Neuverbindung.
Gilles 'SO - hör auf böse zu sein'
@ Gilles Es ist einfach wieder passiert; Ich habe das straceProtokoll hinzugefügt . straceAuf dem Hauptbildschirm wird ein ähnlicher Block in einem write()Anruf angezeigt
Michael Mrozek
Es scheint zu passieren, wenn der zuvor verbundene Bildschirm nicht sauber getrennt wurde (in diesem Fall hatte ich ihn an einen anderen Computer angeschlossen, der dann seine Netzwerkverbindung verlor). Könnte screenversuchen , auf eine Verbindung zu schreiben , dass nicht mehr existiert?
Michael Mrozek
Ist der Hauptbildschirmprozess (der so genannte SCREEN) noch aktiv? Was macht es ( strace)?
Gilles 'SO- hör auf böse zu sein'

Antworten:

8

Ich bin mir nicht sicher, ob ich dasselbe Problem hatte wie Sie, aber manchmal habe ich jedes Mal, wenn mein Netzwerk versehentlich getrennt wurde, das gleiche Bildschirmverhalten.

Nach einer Weile (ca. 10-15 Minuten) steht der Bildschirm wieder zur Verfügung. Nach einigen Untersuchungen habe ich eine kleine Notiz in der Manpage gefunden:

   nonblock [on|off|numsecs]

   Tell  screen  how to deal with user interfaces (displays) that cease to
   accept output. This can happen if a user presses ^S or a TCP/modem con‐
   nection gets cut but no hangup is received. If nonblock is off (this is
   the default) screen waits until the display restarts to accept the out‐
   put.  If  nonblock is on, screen waits until the timeout is reached (on
   is treated as 1s). If the display  still  doesn't  receive  characters,
   screen will consider it "blocked" and stop sending characters to it. If
   at some time it restarts to accept characters, screen will unblock  the
   display and redisplay the updated window contents.

Vielleicht hilft es jemandem, denn dies ist die einzige Seite, auf der es um das Einfrieren des Bildschirms geht, nachdem Google mir die Verbindung getrennt hat.

eilen
quelle
Ich verstehe nicht genau, wie es mit diesem Manpage-Eintrag zusammenhängt, aber das hat es für mich behoben. Ich habe es vor nonblock 5einer Weile eingestellt und bin nur wieder auf das Problem gestoßen, und nach 5 Sekunden hat es sich plötzlich normal angehängt
Michael Mrozek
6

Ihre Bildschirmsitzung hängt wahrscheinlich und wartet auf das Pseudo-Terminal der Shell, mit der Sie zuletzt eine Verbindung zum Bildschirm hergestellt haben. Manchmal lässt eine unterbrochene Verbindung diese Hülle herum und der Bildschirm muss eine Zeitüberschreitung aufweisen, um sich davon zu lösen.

Wenn Sie ausführen ls -l /proc/<screen_pid>/fd/<descriptor_of_hung_write>, sollten Sie sehen, dass dies die Punkte der vorherigen Shell-Sitzung sind.

Sobald Sie die angehängte Bash / Shell-Sitzung beendet haben, können Sie sie erneut anhängen.

# ps auwxf|grep -B2 screen
root     23214  0.0  0.0 109304  4016 ?        Ssl  19:13   0:00  \_ sshd: root@pts/6 
root     23566  0.0  0.0 117400  2272 pts/6    Ss   19:13   0:00      \_ -bash
root     10445  0.0  0.0 125156  1156 pts/6    S+   19:23   0:00          \_ screen -ADR MYSCREEN

In diesem Fall wird durch das Beenden von Prozess 23214 die Bildschirmsitzung freigegeben, und Sie können erneut eine Verbindung herstellen.

ZachL
quelle
3
Was soll ich tun, wenn es keinen übergeordneten Prozess gibt?
d33tah
Dieser hat mir heute geholfen und den sshd-Bildschirm wieder reaktionsschnell gemacht! Stunden und Stunden Arbeit gespart!
user230910
4

Wurde der Bildschirm aktualisiert, seit diese Bildschirmsitzungen gestartet wurden?

Ich kann mich nicht an die genauen Details erinnern, aber ich erinnere mich, dass vor ungefähr einem Monat oder drei Jahren ein apt-get dist-upgrade(auf debian sid) aktualisierter Bildschirm auf meinem System und der Postinst mich vor einem inkompatiblen Upgrade gewarnt haben. Eine Kopie des alten Bildschirms wurde aufbewahrt (irgendwo unter / tmp IIRC), um das erneute Anschließen an alte Sitzungen zu ermöglichen. Es wurde jedoch empfohlen, diese zu beenden und neu zu starten.

Die Symptome, die Sie melden, hören sich ähnlich an, als ich versehentlich versuchte, die Verbindung zu einer alten Bildschirmsitzung mit dem neuen / usr / bin / screen wiederherzustellen.

Möglicherweise war dies von dpkg.log im Juni:

2012-06-14 08:11:51 upgrade screen:amd64 4.0.3-14 4.1.0~20120320gitdb59704-2

cas
quelle
Dieses Problem wurde behoben, bevor Debian 7 Wheezy veröffentlicht wurde. Es ist jedoch in den entsprechenden Upstream-Releases oder Git-Snapshots enthalten. Siehe bugs.debian.org/683228
Axel Beckert
Dies ist mir heute auf einer älteren Centos 6-Installation passiert. Vielen Dank!
Mike Andrews
Ich war gerade auf Gentoo davon gebissen, ich habe ein Upgrade von 4.3 auf 4.4 durchgeführt.
25.