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
strace screen -d -r foo
(möglicherweise müssen Sie eine nicht festgelegte [ug] -ID-Kopie der screen
ausführbaren Datei erstellen) und strace -p$(pidof SCREEN)
ungefähr zum Zeitpunkt einer fehlgeschlagenen Neuverbindung.
strace
Protokoll hinzugefügt . strace
Auf dem Hauptbildschirm wird ein ähnlicher Block in einem write()
Anruf angezeigt
screen
versuchen , auf eine Verbindung zu schreiben , dass nicht mehr existiert?
SCREEN
) noch aktiv? Was macht es ( strace
)?