У меня есть несколько продолжительных сеансов экрана GNU. Я ssh к коробке, на которой они работают, и запускаю, screen -d -r foo
чтобы отсоединить их, если они подключены где-либо еще, а затем прикрепить их в моем текущем окне.
99% времени это работает нормально, но иногда я получаю это:
$ screen -d -r foo
[2430.foo detached.]
... и ничего не происходит; Я не могу вернуться к раковине вообще. Попытка в другом окне делает то же самое, единственное, что я могу сделать, это уничтожить этот сеанс экрана (потеряв все программы, которые в нем работали) и воссоздать его
Почему это происходит? Как я могу избежать этого или восстановить соединение, когда это произойдет?
Редактировать : Мой .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
Редактировать : конец strace
журнала при попытке присоединить:
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
(вам может потребоваться сделать не установленную [ug] id копию screen
исполняемого файла) и strace -p$(pidof SCREEN)
примерно во время неудачного переподключения.
strace
журнал. strace
На главном экране процесса показан похожий блок во время write()
разговора
screen
вы пытаетесь записать соединение, которого больше не существует?
SCREEN
) все еще жив? Что он делает ( strace
)?