저는 Linux를 처음 접했고 지금까지 배운 것은 gnome 터미널을 통해 새 프로세스를 열면(예: gedit &
"& 백그라운드에서 실행") 터미널을 닫으면 gedit도 종료된다는 것입니다. 그래서 이를 방지하기 위해 우리는이 과정을 거부하다상위 터미널에서 gedit의 프로세스 ID를 제공합니다.
그러나 나는 특징을 발견했습니다. 이제 gnome-terminal(parent) 에서 gnome-terminal을 열면 gnome-terminal &
부모 터미널을 닫으면 자식 터미널을 거부하지 않아도 자식 터미널이 닫히지 않는다는 것입니다.
왜? 변칙이 존재한다면 무엇이 변칙을 만드는가? 이 예외를 언급하는 구성 파일은 어디에서 찾을 수 있습니까(접근 가능한 경우)?
답변1
GNOME 터미널 창을 닫으면 쉘 프로세스(또는 터미널에 실행하도록 지시한 모든 명령의 프로세스)는 SIGHUP 신호를 수신합니다. 프로세스는 다음을 수행할 수 있습니다.잡다지정된 함수가 호출되었음을 의미하는 SIGHUP은 대부분의 쉘에서 포착됩니다. Bash는 모든 백그라운드 프로세스(거부된 프로세스 제외)에 SIGHUP을 전송하여 SIGHUP에 반응합니다.
예제 보기( gedit
및 의 도움을 받아): GNOME 터미널 창이 닫힐 때 gedit는 셸에서 SIGHUP을 전송하고 SIGHUP을 포착하지 못하므로(무시하지 않음) gedit가 즉시 종료됩니다. .pstree
strace
─gnome-terminal(31486)─bash(31494)─gedit(31530) [31486] getpgid(0x7b06) = 31494 [31486] kill(-31494, SIGHUP) = 0 [31494] --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=31486, si_uid=0} --- [31494] kill(-31530, SIGHUP) = 0 [31530] --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=31494, si_uid=0} --- [31530] +++ SIGHUP에 의해 사망 +++ [31494] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=31530, si_status=SIGHUP} --- [31486] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=31494, si_status=SIGHUP} ---
gnome-terminal
그러나 명령을 입력하고 기존 GNOME 터미널 창이 있는 경우 기본적으로 GNOME 터미널은 특이한 작업을 수행합니다. org.gnome.Terminal.Factory
D-Bus를 통해 팩토리를 호출한 다음 쉘에 표시되는 백그라운드 작업은 즉시 종료됩니다. 두번째.
해당 팩토리 호출의 결과로 입력 후 나타나는 새 창은 gnome-terminal
새 스레드에 의해 관리됩니다.동일한 그놈 터미널 프로세스기존 창을 관리하는 것입니다. 첫 번째 셸은 두 번째 셸의 프로세스 ID를 모르며 자동으로 종료할 수 없습니다.
─그놈 터미널(9063)─┬─bash(39548) │ └─bash(39651) ├─{그놈 터미널}(9068) └─{그놈 터미널}(9070)
반면에 를 입력하면 gnome-terminal --disable-factory &
팩토리를 호출하지 않으며 프로세스 측면 gedit
에서는 예제와 같이 동작합니다.
──gnome-terminal(39817)──bash(39825)──gnome-terminal(39867)──bash(39874) │ =─{그놈 터미널}(39868) │ └─{그놈 터미널}(39819)첫 번째 터미널 창을 닫으면 첫 번째 터미널 창과 두 번째 터미널 창이 모두 닫힙니다.
답변2
여기서는 Xfce를 실행하고 있지만 Gnome Terminal에도 동일한 상황이 적용될 수 있습니다.
두 개의 echo $$
터미널 창에서 [edit: then run]을 실행 하면ps faux
하나 xfce4-terminal
프로세스이지만 bash
동일한 상위를 갖는 두 개의 다른 프로세스, 즉 xfce4-terminal
프로세스 자체입니다. 실제로 하나의 터미널 프로세스만 여러 창을 표시합니다. 창이 반드시 프로세스를 의미하는 것은 아닙니다. ps faux
직접 달려가서 확인해 보세요.