손실 된 화면 (분리, 누락 된 소켓)에 다시 연결하려면 어떻게합니까?


23

screen홈 서버 에서 세션을 실행했습니다. 내 워크 스테이션을 다시 부팅해야했기 때문에 터미널을 분리하여 종료했습니다. 서버에 다시 연결하면 일반적인

$ screen -D -R
[new screen]

응? 아니요, 새 세션이 아니라 이전 세션을 gimme하십시오. 나는 그것을 직접 잡을 것이다. 소켓 이름은 무엇입니까?

$ screen -list
No Sockets found in /var/run/screen/S-username

$ ls -a /var/run/screen/S-username
.  ..

무엇을 기다립니다? 나는 그것을 뛰었다는 것을 안다. 어디 갔어?

$ ps -ef | grep -i screen
username  30860     1  0 Oct16 ?        00:00:29 SCREEN

글쎄, 그 과정이 있습니다. 그러나에 전달할 소켓이 없습니다 screen -r. 세션에 어떻게 다시 연결할 수 있습니까?

답변:


28

ScreenSIGCHLD신호를 수신 할 때마다 fifo / 소켓을 확인합니다 . 소켓이 없으면 다시 작성됩니다. 해결책은 프로세스를 찾아서 보내는 것 SIGCHLD입니다.

내 데비안 시스템에서 screensetgid로 설치 utmp되었지만 setuid가 아닌 것으로 보이 므로 아래 FAQ의 첫 번째 솔루션이 작동했습니다.

$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost

화면이 setuid 설치되어있는 시스템에서는 root작동하지 않으며 커널이 사용자에게 신호를 보내도록하려면 활성 화면 세션의 하위 프로세스 중 하나를 종료해야합니다. 이것은 화면 창 중 하나를 희생하여 나머지와 다시 연결하는 것을 의미합니다 (현명하게 선택하십시오!).

에서 보관 젠투 위키 자주 묻는 질문 :

소켓 누락

실제 프로세스와 모든 하위 프로세스가 여전히 실행 중이지만 여전히 실행중인 화면의 소켓이 손상 될 수 있습니다. screen -list에 "/ tmp / uscreens /.에 소켓이 없습니다"라는 메시지가 표시됩니다. http://www4.informatik.uni-erlangen.de/ ~ jnweiger / screen-faq.html # MISC 약 2/3가 줄었습니다.

Q : 알 수없는 이유로 / tmp / screens / S-myname의 fifo가 없어서 화면 세션을 다시 시작할 수 없습니다. fifo를 재현하는 방법이 있습니까?

A : 스크린은 SIGCHLD 신호를받을 때마다 fifo / 소켓을 확인합니다. 누락 된 경우 fifo / 소켓이 다시 작성됩니다.

화면이 set-uid아닌 경우 사용자는 kill -CHLD screenpid직접 발행 할 수 있습니다 ( -CHILD일부 시스템에 있음). Screenpid는 ps -x목록 에서 찾은 화면 프로세스의 프로세스 ID입니다 .

그러나 화면은 setuid root를 설치해야하기 때문에 일반적으로 작동하지 않습니다. 이 경우 신호를 보낼 수 없지만 커널은 신호를 보낼 수 있습니다. 화면의 자식이 상태를 변경할 때마다 그렇게합니다. 화면 내에서 실행중인 "최소 중요"쉘의 process-id (아래에서 셸 피드)를 찾으십시오. 시도하십시오 kill -STOP shellpid. fifo / 소켓이 다시 나타나지 않으면 쉘 프로세스를 파기하십시오. 하나의 껍질을 희생하여 나머지를 저장하십시오. 아무것도 작동하지 않으면 손실 된 화면 세션에서 실행중인 모든 프로세스를 제거하는 것을 잊지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.