폐기되어 터미널을 잃은 프로세스의 결과는 어떻게됩니까?


26

일부 프로세스가 시작된 가상 터미널을 닫으면 출력이 바로 가거나 /dev/null메모리를 어떻게 오염시킬 수 있습니까? 어쨌든 출력을 계속 읽을 수 있습니까?

[편집] : 프로세스를 실제로 폐기하는 순간이 출력을 제어 할 수있는 나의 힘의 끝입니까?

또한 중지 된 프로세스를 제거하면 처음에는 모든 것이 정상인 것처럼 보입니다. 작업이 종료되거나 표시되지 않습니다. 그러나 로그 아웃하면 ( 예를 들어 터미널을 닫는 것을 의미 하지 않고su 예를 들어 종료하십시오) 프로세스가 종료됩니다. 모두 동일하게 백그라운드에서 실행되지 않는 프로세스가 계속 실행될 수 있습니다.


2
"어쨌든 결과를 얻을 수 있습니까?" 그러나 실행중인 프로세스를 제거하고 새 화면 셸에 연결하려면 어떻게해야합니까?를 참조하십시오. 더러운 속임수에 대한 다른 인용 된 질문 (모두 디버거를 프로그램에 연결하고 어떻게 든 다른 출력 파일을 여는 지에 따라 다름).
Gilles 'SO- 악한 중지'

그 질문에 대한 링크를 주셔서 감사합니다. 그것은 지금까지 최고의 답변을 주었다! 특히 영리한 retty프로그램.
rozcietrzewiacz

1
관련 질문에 대한 이 답변 도 참조하십시오 .
Stéphane Gimenez

답변:


11

프로세스가 "삭제"되었다는 사실은이 프로세스를 생성 한 대화식 쉘에만 의미가 있습니다. 쉘이 작업 테이블에 프로세스를 더 이상 포함하지 않으며 쉘이 종료 될 때 SIGHUP이이 프로세스로 전송되지 않음을 의미합니다. 실제로 귀하의 질문과 관련이 없습니다.

삭제 된 가상 터미널로 전송되는 출력에 대한 정보 : 테스트를 직접 수행 한 결과 /dev/pts/x장치에 액세스 할 수 없으며 장치를 가리키는 모든 파일 설명자가 닫힐 때까지 다시 할당되지 않습니다. 따라서 삭제 된 터미널에 쓰는 내용이 저장되는 이유를 알 수 없습니다. POSIX에 의해 정의되지 않은 것 같습니다.

터미널에 쓰는 일부 프로세스의 출력을 잡는 것에 대해서는 터미널이 여전히 살아있을 때조차 가능하지 않다 ¹. 터미널에 직접 입력을 가져 오기만하면됩니다 (예 : 키 입력 또는 pty의 마스터 부분에 의한 시뮬레이션 키 입력). 프로세스가 터미널에 쓰여진 내용을 stdin에서 읽으면 대부분의 프로세스에서 자체 io 루프가 발생합니다.

프로세스 종료에 대한 마지막 설명에 대해, 나는 실제로 무슨 일이 일어나고 있는지 모르겠지만 세션이있을 때 프로세스 그룹의 전경 / 백그라운드 상태와 관련된 신호 (SIGTTOU, SIGTTIN, SIGHUP 또는 기타)와 관련하여 다소 이상한 행동을 의심합니다. 리더 종료 (예 : su언급 한 경우).

편집 에 대한 답변 : 아니오, 출력과 관련하여 프로세스가 제거 될 때 아무런 변화가 없습니다 : 이미 데몬처럼 분리되지 않는 한 여전히 제어 터미널에 연결됩니다. 를 사용하여 볼 수 있습니다 ps. 그러나이 프로세스에서는 더 이상 셸에서 제공 한 fg/ bg/ jobs명령 을 사용할 수 없습니다 . 즉, 터미널에서 입력을 공급하기가 어려울 수 있습니다 (포 그라운드 프로세스 그룹에 있어야 함).


1. 프로세스가 디버깅 도구에 기꺼이 걸리거나 납치되지 않는 한 (위의 주석 참조).


1
이것을 명확히 해 주셔서 감사합니다. 실제로 프로세스를 폐기한다는 사실 은 여전히 내 질문과 관련 이 있습니다 . 프로세스를 폐기 한 후 출력을 제어하는 ​​능력을 잃어버린 것 같습니다. (터미널이 닫혀 있어도) 해당 사례를 포함하도록 질문을 편집합니다.
rozcietrzewiacz

4

이 특정 질문을 해결하기 위해 :

일부 프로세스가 시작된 가상 터미널을 닫으면 출력이 바로 / dev / null로 이동합니까, 아니면 어떻게 든 메모리를 오염시킬 수 있습니까?

터미널과 터미널에 연결된 프로그램은 파일처럼 읽고 쓰는 방식으로 tty 장치를 통해 통신합니다. 구체적으로, 가상 터미널은 "의사 -tty"(약칭 "pty")를 생성 한 다음 쉘 (또는 다른) 프로세스를 생성하고 해당 프로세스의 stdin / out / err을 pty에 연결합니다. (자세한 내용은 운영 체제에 따라 다릅니다.)

가상 터미널을 닫으면 가상 터미널은 연결 끝 (pty "master")을 닫습니다. 그 후, 연결의 다른 쪽 끝에있는 프로그램이 tty에 쓰면 오류가 리턴되고 데이터는 어디로 가지 않습니다. 마찬가지로 tty에서 읽은 경우 EOF (파일 끝) 표시기가 다시 나타납니다.


감사합니다-좀 더 프로그래밍 관점에서 멋지고 명확한 설명.
rozcietrzewiacz


0

Gilles의 의견 덕분 에이 질문 을 지적하면서 retty 라는 프로그램에 대해 배웠습니다 .

프로세스의 출력을 읽을 수 있는지 여부를 불문하고 처리 여부에 관계없이 (의사) tty에 다시 첨부하기 위해 더러운 해킹을 사용하는 것 같습니다. 그래서 이것은 내 질문의 첫 부분 대부분에 대한 답변 인 것 같습니다. 두 번째는 Stéphane 이 대답 했습니다 .

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