다시 연결하려고 하면 GNU 화면이 멈춥니다.

다시 연결하려고 하면 GNU 화면이 멈춥니다.

오랫동안 실행되는 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

답변1

저에게도 귀하와 같은 문제가 있는지는 모르겠지만 네트워크가 예기치 않게 다운될 때마다 비슷한 화면 동작이 나타나는 경우가 있습니다.

잠시 후(약 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이 제공한 유일한 페이지이기 때문에 누군가에게 도움이 될 수도 있습니다.

답변2

마지막으로 화면에 연결한 셸의 의사 터미널을 기다리면서 화면 세션이 중단될 수 있습니다. 때로는 연결이 끊어지면 셸이 종료되고 화면이 분리되기 전에 화면이 시간 초과되어야 하는 경우도 있습니다.

을 실행하면 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

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

기억이 안나요정밀한세부 사항이지만 한두 달 전에 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

관련 정보