.xsession 파일이 마지막 프로세스가 포그라운드에 있을 것으로 예상하는 이유를 이해하려고 노력 중입니다. 그렇지 않으면 X11 세션이 중지되어야 합니다.
작은 독립형 스크립트가 있습니다. 실행하면 "less"가 배경에 있기 때문에 즉시 종료됩니다.
$ ls -l total 4
-rwxr-xr-x 1 user user 17 Feb 28 21:17 a
-rw-r--r-- 1 user user 0 Feb 28 20:22 b
$ cat a
less b &
echo $!
나는 "적은" 도구가 주로 포그라운드에서 상호 작용한다는 것을 이해합니다. 어떻게 하는지는 모르겠지만 더 이상 포그라운드에서 실행되지 않고 입력을 받을 수 없거나 사용자에게 일부 출력을 표시할 수 없다는 것을 인식한 것 같습니다. 따라서 실행은 더 이상 유용하지 않으므로 종료됩니다. 아니면 정확히 무슨 일이 일어났나요?
창 관리자를 백그라운드에 놓으면 왜 종료되나요? 포그라운드에서 실행되지 않고 X 서버를 통해 키보드/마우스 입력을 받을 수 없고 더 이상 유용하지 않기 때문에 종료됩니까?
답변1
이것은 실제로 완전히 다른 두 가지 현상입니다.
less
백그라운드에 있는지 자체적으로 확인하지 않습니다(터미널과 상호 작용하는 프로그램의 경우 일반적임). 프로세스 1의 프로세스는 커널의 일반 터미널 드라이버에 의해 추적됩니다.전망. 포그라운드 프로세스(보다 정확하게는 프로세스 그룹)는 하나만 있을 수 있습니다. 쉘은 시스템 호출을 합니다(tcsetpgrp
) fg
내장 함수를 사용하여 프로세스를 전경으로 가져올 때. 이 시스템 호출은 지정된 프로세스를 포그라운드 프로세스로 만듭니다.
프로세스가 터미널²에서 데이터를 읽으려고 시도할 때 터미널 드라이버는 프로세스가 포그라운드에 있지 않은 경우 프로세스에 SIGTTIN 신호를 보냅니다. 기본적으로 이 신호는 프로세스를 정지시킵니다(예: SIGSTOP). 마찬가지로 제어 터미널에 쓰기를 시도하는 백그라운드 프로세스는 SIGTTOU를 수신합니다. 대부분의 쉘은 이런 일이 발생하면 일반적으로 메시지를 표시합니다 [1] + suspended (tty output) less myfile
.
단말기에 대한 자세한 내용은 단말기 설명을 참고하세요.범용 터미널 인터페이스POSIX 표준에서. (이 책은 쉽게 읽을 수 있는 책이 아닙니다. 대부분의 사용자보다 훨씬 많은 내용을 담고 있으며 더 많은 프로그래머가 알아야 할 것입니다.)
창 관리자는 터미널과 상호 작용하지 않으므로 터미널의 백그라운드 및 포그라운드 프로세스 개념이 적용되지 않습니다. X 세션이 종료되면 X Server 3도 종료됩니다. 창 관리자를 호출하는 스크립트는 세션에서 수행할 작업을 알려줍니다. 창 관리자를 백그라운드에 두고 창 관리자를 기다리지 않고 세션 스크립트가 종료되도록 하면 세션이 예상보다 일찍 종료됩니다.
¹무엇프로세스 그룹, 실제로는 (파이프와 비슷하지만) 여기서는 자세히 설명할 필요가 없습니다.
² 해당제어 터미널실제로.
³ 애플리케이션에서 창 그리기, 입력 읽기 등과 같은 명령을 실행하는 GUI의 백엔드 부분입니다.
답변2
창 관리자가 전경, 배경 또는 어떤 종류의 작업 제어 하에 있어야 한다는 요구 사항은 없습니다. 원하지 않으면 창 관리자를 실행할 필요조차 없습니다!
유일하게 중요한 점은 .xsession
스크립트가 종료되면 세션도 종료된다는 것입니다. 종료 되면 .xsession
X 서버 자체도 종료되며, 아직 연결되어 있는 모든 프로세스는 강제 종료됩니다.
따라서 .xsession
스크립트는 일반적으로 스크립트가 마지막으로 실행하는 작업이 세션과 관련된 일종의 장기 실행 프로세스가 되도록 작성됩니다. 창 관리자 또는 세션 관리자일 수 있습니다(현대적인 고급 데스크톱 환경에서 더 일반적임). 프로세스는 exec
실행 중인 쉘을 대체하도록 실행되거나 .xsession
쉘이 이를 기다리도록 포그라운드 프로세스로 실행됩니다. 어느 쪽이든 프로세스가 종료되면 세션이 종료됩니다.
예제 셸 스크립트는 less
백그라운드에서 시작된 다음 즉시 종료됩니다. 백그라운드 프로세스를 기다리지 않습니다. 종료 여부에 관계 없이 less
종료됩니다 . less
백그라운드에서 계속 실행될 수 있지만 쉘 스크립트를 어떻게 실행하든 눈치 채지 못할 것입니다. .xsession
동일한 방식으로 작성된 스크립트에서도 동일한 문제가 발생합니다.