다시 연결하려고하는 GNU 화면 정지


16

장기 실행되는 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

당신의 ~ / .screenrc을 읽습니다 (그리고이 정의되어있는 경우 어쩌면을 / etc / SCREENRC)이 될 수 있습니다 도움이 게시
user2387

strace screen -d -r foo(연결되지 않은 screen실행 파일의 사본을 만들어야 할 수도 있음 ) 및 strace -p$(pidof SCREEN)재 연결 실패시 출력을 게시하십시오 .
Gilles 'SO- 악마 그만해'

@Gilles 그것은 또 다시 일어났다; strace로그를 추가했습니다 . strace메인 화면 프로세스는 비슷한 write()호출을 보여줍니다
Michael Mrozek

이전에 연결된 화면이 깨끗하게 연결 해제되지 않은 경우에 발생합니다 (이 경우 다른 컴퓨터에서 연결 한 후 네트워크 연결이 끊어졌습니다). screen더 이상 존재하지 않는 연결에 쓰려고 할 수 있습니까?
Michael Mrozek

메인 화면 프로세스 ( SCREEN)가 여전히 살아 있습니까? 무엇을하고 strace있습니까 ( )?
Gilles 'SO- 악마 그만'

답변:


8

내가 당신과 같은 문제가 있는지 확실하지 않지만 때로는 네트워크 연결이 끊어 질 때마다 비슷한 화면 동작이 나타납니다.

잠시 후 (약 10-15 분) 화면을 다시 연결하여 다시 사용할 수 있습니다. 조사를 마친 후 맨 페이지에서 작은 메모를 찾았습니다.

   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.

누군가 도움이 될 수 있습니다 .Google이 나에게 실망한 후 화면 정지에 대한 유일한 페이지이기 때문입니다.


해당 맨 페이지 항목을 기반으로 한 방법을 정확하게 이해하지 못했지만이 문제가 해결되었습니다. nonblock 5얼마 전에 설정 했는데 문제가 다시 발생했고 5 초 후에 갑자기 정상적으로 연결되었습니다.
Michael Mrozek

6

스크린 세션은 마지막으로 스크린에 연결된 쉘의 의사 터미널을 기다리는 중일 수 있습니다. 때때로 연결이 끊어지면 셸 주위에 남게되고 분리하기 위해 화면이 시간 초과되어야합니다.

을 실행 ls -l /proc/<screen_pid>/fd/<descriptor_of_hung_write>하면 이전 셸 세션에 대한 pts임을 알 수 있습니다.

첨부 한 bash / shell 세션을 종료하면 다시 연결할 수 있습니다.

# 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

이 경우, 종료 프로세스 23214는 화면 세션을 해제하고 다시 연결할 수 있습니다.


3
부모 프로세스가없는 경우 어떻게해야합니까?
d33tah

이것은 오늘 나를 도왔고, sshd를 죽이면 화면이 다시 반응하게되었습니다! 작업 시간과 시간이 절약되었습니다!
user230910

4

해당 스크린 세션이 시작된 이후 스크린이 업그레이드 되었습니까?

정확한 세부 사항을 기억할 수는 없지만 약 1 개월 또는 3 개월 전에 apt-get dist-upgrade시스템 의 (데비안 sid로) 업그레이드 된 화면과 postinst가 호환되지 않는 업그레이드에 대해 경고 했다는 것을 기억합니다 . 이전 세션의 사본을 이전 세션에 다시 첨부 할 수 있도록 (/ tmp IIRC 아래에) 보관했지만 세션을 종료했다가 다시 시작하는 것이 좋습니다.

신고 한 증상은 실수로 새로운 / usr / bin / screen을 사용하여 이전 화면 세션에 다시 연결하려고 시도했을 때와 비슷한 소리를냅니다.

6 월에 dpkg.log에서 다음과 같이 작성되었습니다.

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


이 문제는 데비안 7 Wheezy가 출시되기 전에 해결되었습니다. 그러나 업스트림 릴리스 또는 git 스냅 샷에 있습니다. bugs.debian.org/683228
Axel

이것은 구 Centos 6 설치에서 오늘 나에게 일어났다. 감사!
Mike Andrews

나는 Gentoo에서 이것에 물 렸고 4.3에서 4.4로 업그레이드하고있었습니다.
jlh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.