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 strace
Protokolls, 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
quelle
strace screen -d -r foo
(möglicherweise müssen Sie eine nicht festgelegte [ug] -ID-Kopie derscreen
ausführbaren Datei erstellen) undstrace -p$(pidof SCREEN)
ungefähr zum Zeitpunkt einer fehlgeschlagenen Neuverbindung.strace
Protokoll hinzugefügt .strace
Auf dem Hauptbildschirm wird ein ähnlicher Block in einemwrite()
Anruf angezeigtscreen
versuchen , auf eine Verbindung zu schreiben , dass nicht mehr existiert?SCREEN
) noch aktiv? Was macht es (strace
)?Antworten:
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:
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.
quelle
nonblock 5
einer Weile eingestellt und bin nur wieder auf das Problem gestoßen, und nach 5 Sekunden hat es sich plötzlich normal angehängtIhre 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.
In diesem Fall wird durch das Beenden von Prozess 23214 die Bildschirmsitzung freigegeben, und Sie können erneut eine Verbindung herstellen.
quelle
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
quelle