거부되어 터미널을 잃은 프로세스의 출력은 어떻게 되나요?

거부되어 터미널을 잃은 프로세스의 출력은 어떻게 되나요?

일부 프로세스를 시작한 가상 터미널을 닫으면 출력이 직접 로 들어가나요 /dev/null, 아니면 어떻게든 메모리를 오염시키나요? 어쨌든 나중에 언제든지 계속 읽을 수 있도록 출력을 가져올 수 있습니까?

[편집자]: 그렇다면 프로세스를 거부하는 순간 실제로 프로세스의 출력을 제어할 수 있는 권한이 종료되는 것인가요?

또한 중지된 프로세스를 거부하면 처음에는 모든 것이 정상적으로 보입니다. 프로세스가 종료되거나 작업에 표시되지 않습니다. 하지만 내가 나가면 (그리고 나는아니요su이는 종료 등의 터미널을 닫는 것을 의미하며 프로세스가 종료됩니다. 그럼에도 불구하고 백그라운드에서 실행 중인 거부 프로세스는 계속 실행될 수 있습니다.

답변1

프로세스가 "거부"되었다는 사실은 해당 프로세스를 생성한 대화형 셸에만 의미가 있습니다. 이는 쉘의 작업 목록에 프로세스가 더 이상 없으며 쉘이 종료될 때 SIGHUP이 프로세스로 전송되지 않음을 의미합니다. 이것은 귀하의 질문과 크게 관련이 없습니다.

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

터미널에 쓰는 특정 프로세스의 출력을 잡는 것과 관련하여 터미널이 아직 존재하더라도 가능하지 않다고 생각합니다. 당신이 할 수 있는 일은 터미널에서 직접 입력을 받는 것뿐입니다(예: 키 입력 또는 pty의 주요 부분에서 시뮬레이션된 키 입력). 프로세스가 stdin의 터미널에 기록된 내용을 읽는 경우 대부분의 프로세스에서 self-io 루프가 발생합니다.

프로세스 종료에 대한 마지막 말은 무슨 일이 일어나고 있는지 잘 모르겠지만 세션 리더가 종료될 때 프로세스 그룹의 전경/백그라운드 상태와 관련된 신호(SIGTTOU, SIGTTIN, SIGHUP 등)의 다소 이상한 동작이 의심됩니다. (예를 들어 su언급하신 경우).

답변편집하다:아니요, 출력에 관한 한 프로세스가 거부되어도 아무 변화가 없습니다. 프로세스는 여전히 제어 터미널에 연결되어 있습니다(데몬처럼 자체적으로 분리되지 않는 한). 을 사용하는 것을 볼 수 있습니다 . 그러나 이 프로세스 중에는 쉘에서 제공하는 // 명령을 ps더 이상 사용할 수 없습니다 . 이는 터미널에서 입력을 공급하는 것이 어려울 수 있음을 의미합니다(포그라운드 프로세스 그룹에 있어야 함).fgbgjobs


1. 프로세스가 원하지 않는 한 일부 디버깅 도구를 사용하여 프로세스를 하이재킹합니다(위 참고 사항 참조).

답변2

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

일부 프로세스를 시작한 가상 터미널을 닫으면 출력이 /dev/null로 직접 이동합니까, 아니면 메모리를 오염시키나요?

터미널과 터미널에 연결된 프로그램은 파일을 읽고 쓰는 것처럼 tty 장치를 통해 통신합니다. 특히 가상 터미널은 "pseudo-tty"(줄여서 "pty")를 생성한 다음 셸(또는 기타) 프로세스를 생성하고 해당 프로세스의 stdin/out/err을 pty에 연결합니다. (세부 사항은 운영 체제에 따라 다릅니다.)

가상 터미널을 닫으면 가상 터미널도 해당 연결 끝(pty "마스터")을 닫습니다. 이후 연결 반대편의 프로그램이 tty에 쓰면 오류가 반환되고 데이터는 어디에도 전송되지 않습니다. 마찬가지로 tty에서 읽는 경우 EOF(파일 끝) 표시를 반환합니다.

답변3

질문의 가장 흥미로운 부분에 대답하려면: 실시간 실행 프로그램의 출력을 변경하려면 해당 파일 설명자를 편집해야 합니다. 이는 gdb를 사용하여 쉽게 수행할 수 있습니다. 해킹이지만 작동합니다.

바라보다:

https://stackoverflow.com/questions/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line

도우미 스크립트는 다음 위치에 있습니다.http://users.linpro.no/ingvar/fdswap.sh.txt.

답변4

나를 지적하는 의견을 주신 Gilles에게 감사드립니다.이 문제, 저는 다음과 같은 프로젝트에 대해 배웠습니다.레티.

(의사) tty에 다시 연결하기 위해 일부 더러운 해킹을 사용하는 것으로 보이며 거부 여부에 관계없이 프로세스의 출력을 계속 읽을 수 있도록 효과적으로 허용합니다. 그래서 이것은 내 질문의 첫 번째 부분의 대부분에 대답하는 것 같습니다. 두 번째가 대답했다.스티븐에 의해.

관련 정보