나는 Debian Wheezy(스크린 버전)를 실행하는 컴퓨터를 가지고 있습니다.4.01.00 개발) 및 또 다른 Debian Squeeze(스크린 버전)4.00.03jw4) 그리고 이 두 화면 아래에서 screen이라는 다른 프로세스를 자동으로 시작합니다. 예를 들어:
init(1)-+-acpid(1926)
|-sshd(2139)---sshd(2375)---bash(2448)---screen(6649)---screen(6650)-+-bash(6651)---pstree(6751)
ps
PID 6649 명령 에 따르면 screen
PID 6650 명령은 다음과 같습니다 SCREEN
.
root@vserver:~# ps -f -p 6650
UID PID PPID C STIME TTY TIME CMD
root 6650 6649 0 11:26 ? 00:00:00 SCREEN
root@vserver:~#
왜 screen
이런 일이 발생합니까?
답변1
외부(PID 6649)는 시작한 터미널에 연결하고, ( + , )를 분리하면 종료됩니다 screen
.Ctrlad
내부 screen
(PID 6650)는아니요이 터미널에 연결하되 대신 bash
이 터미널에서 시작된 장치가 연결되는 자체 의사 터미널(pty) 장치를 제어합니다.
외부 터미널에 무언가를 입력하면 외부 터미널이 screen
그것을 받아 소켓을 통해 내부 화면으로 보낸 다음 입력을 제어하는 pty로 전달하여 결국 bash
(또는 다른 프로그램에 도달하게 됩니다.) )는 bash에서 시작하고 동일한 pty를 통해 제어됩니다. bash의 출력(또는 여기에서 시작된 모든 프로그램)은 inner screen
의 pty로 전송되며, 이로 인해 내부는 screen
소켓을 통해 외부로 보내게 되고 screen
궁극적으로 시작한 터미널로 전송됩니다 screen
(귀하의 경우는 다시 다음과 같습니다). pty 생성자 ssh
에 의해 소켓이 생성됩니다.내부에 screen
, 분리 및 재연결이 가능합니다(아래 참조).
인스턴스를 분리하면 인스턴스가 제어하는 내부 및 pty가 계속 존재하게 screen
됩니다 . screen
이것이 연결된 프로세스가 I/O를 시도하더라도 살아남는 이유입니다. 그러나 외부단말이 screen
종료되어 외부단말의 연결이 끊어지게 됩니다. 예를 들어, 이제 ssh
세션을 종료하여 해당 pty를 삭제할 수 있으며, screen
자체 pty 장치를 통해 통신하므로 내부적으로 또는 해당 프로그램에 의해 시작된 프로그램에는 영향을 미치지 않습니다.
이제 다시 로그인하고(다른 pty 생성) screen -r
호출 내부 인스턴스와 다시 연결되고 그 후 다시 표시하기 위해 자체 pty의 현재 상태를 "외부"로 보냅니다. I/O 전송 라인은 외부 인스턴스에 대해 이전과 같이 발생합니다 .screen
screen
screen
screen
screen
지금 하나 만들면 pstree
찾을 수 있습니다.둘Lines: 하나는 새로운 "외부" 인스턴스로 시작하고 끝나며 screen
, 다른 하나는 분리할 때 더 이상 상위 인스턴스가 없는 "내부" 인스턴스로 시작합니다.sshd
screen
screen
screen
간단히 말해서:
- "외부" 화면(PID 6649)은 상호 작용 중인 터미널(귀하의 경우에 의해 생성된 pty
ssh
)에 연결되며 인스턴스에 연결되어 있는 동안에만 존재합니다screen
. - "내부" 화면(PID 6650)은 화면 아래에서 시작하는 프로그램에 대해 별도의 pty를 제공하고 외부 인스턴스와 내부 인스턴스 간에 터미널 상태를 전달하기 위한 소켓도 제공합니다
screen
. 종료할 때까지screen
(분리하지 않음) 유지됩니다. - 이러한 분리는 제어되는 프로그램이 외부 pty가 종료된 후에도 살아남을 수 있도록 하는 데 필요합니다(다른 pty에 연결하여 pty와 해당 제어 프로세스(내부
screen
)는 외부 터미널에서 분리되어도 살아남습니다). 내부는screen
연결할 수 있는 소켓의 새 인스턴스를 제공합니다screen
.
답변2
두 번째 프로세스(예제에서 PID가 6650인 프로세스)의 이유는 로그아웃할 수 있도록 tty 연결(stdin, stdout 및 stderr)을 닫는 것입니다. 나중에 다시 로그인해서 화면을 다시 확인해 보세요.
보시다시피 PID 6650은 tty에 연결되어 있지 않습니다(TTY 열에 "?"가 표시됨).