상위 프로세스(터미널)를 닫아도 특정 하위 프로세스는 닫히지 않습니다.

상위 프로세스(터미널)를 닫아도 특정 하위 프로세스는 닫히지 않습니다.

저는 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가 즉시 종료됩니다. .pstreestrace

─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.FactoryD-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직접 달려가서 확인해 보세요.

관련 정보