그놈 터미널에서 새 프로세스를 시작한 다음 해당 프로세스가 하위 프로세스를 포크합니다. 하지만 상위 프로세스를 종료하면 고아 프로세스의 상위 ID는 1( init --user
pid를 나타냄)이 아닌 값이 됩니다.
가상 터미널에서 이 작업을 수행하면 상위 프로세스 pid는 1이며 이는 init
해당 프로세스를 나타냅니다.
GNOME 터미널에서 새 프로세스를 실행하여 종료 시 하위 프로세스의 상위 프로세스 pid가 init --user
프로세스의 pid 대신 1이 되도록 하려면 어떻게 해야 합니까?
감사합니다.
답변1
나는 이미 대답했습니다.몇 달 전에도 비슷한 문제가 있었습니다. 먼저 기술적인 세부 사항을 살펴보시기 바랍니다. 여기서는 이 답변이 귀하의 상황을 어떻게 다루는지 보여 드리겠습니다.
앞서 설명했듯이 저를 비롯한 다양한 데몬 모니터링 유틸리티의 작성자들은 Linux를 활용하고 있습니다.지금실제로, 여러분이 보는 것은 실행 중인 것입니다. 제가 보여드린 것과 거의 똑같습니다.
누락된 유일한 정보는 init --user
귀하의 정보입니다.세션 인스턴스벼락 부자. 처음 로그인할 때 시작되고 로그아웃할 때 중지됩니다. 세션별 작업을 수행할 수 있는 곳(MacOS 10과 유사하지만 완전히 동일하지는 않음)사용자 에이전트아래 launchd
) 귀하의 것입니다.
몇 년 전 우분투 사람들은 세션별 작업에 신생 기업을 고용하기 위해 그래픽 데스크탑 시스템으로 전환하기 시작했습니다. 그놈 터미널은 세션별 작업으로 시작되며 모든 고아는 가장 가까운 하위 리퍼(물론 신생 기업의 세션별 인스턴스)에 의해 상속됩니다.
systemd 사람들은 최근 몇 달 동안 동일한 작업을 수행해 왔으며, 각 사용자의 systemd 인스턴스에서 개별 탭을 별도의 systemd 서비스로 실행하도록 GNOME 터미널을 설정했습니다. (귀하의 질문은 systemd가 아닌 upstart에 관한 것이라고 말할 수 있습니다. 왜냐하면 systemd 시스템에서는 child reaper 프로세스가 이기 때문입니다 systemd --user
.)
우분투 세션 초기화 프로세스의 PID 대신 하위 프로세스의 상위 PID가 1이 되도록 GNOME 터미널에서 새 프로세스를 실행하려면 어떻게 해야 합니까?
이것은 의도적으로 어렵습니다. 서비스 매니저생각하다고아 프로세스를 추적합니다. 그들은 원한다아니요#1을 처리하려면 그들을 잃어버리세요. 따라서 간단한 요점은 이 작업을 중단하는 것입니다.
단지 프로세스를 생각하기 때문에 이 질문을 하는 경우~해야 한다상위 프로세스 ID가 1이면 이 아이디어를 포기하십시오.
이것이 데몬의 한 측면이라고 잘못 생각한다면, 1990년대 IBM의 시스템 리소스(일부 Unices에서는 그렇지 않지만 전체 시스템은 그렇지 않음) 컨트롤러 및 Bernstein의 daemontools와 같은 것들이 출현한 이후 상위 프로세스 ID 1을 가진 데몬은 보장되지 않는다는 점에 유의하십시오. . 어쨌든 로그인 세션에서 더블포킹을 해서 데몬이 되는 것은 불가능합니다. 이것은 오랫동안 시기상조인 생각으로 여겨져 왔습니다.
이것이 고아 프로세스에 대해 자명하다고 잘못 생각한다면 이전 답변을 다시 읽어보십시오. #1의 절대주의는 잘못된 것이며 이 글을 쓰는 시점에서 3년 넘게 잘못되었습니다.
이상한 이유로 자식 프로세스가 있는 경우정말이것이 필요하다면, 이 이상함의 원인이 무엇인지 찾아내고 고치십시오. 이는 버그일 수도 있고 누군가가 잘못된 설계 가정을 했을 수도 있습니다. 이유가 무엇이든, 데몬 관리의 세계는 1990년대에 바뀌었고 Linux는 몇 년 전에 몇 가지 변화를 겪었습니다. 이제 따라잡을 시간입니다.
추가 읽기
- "세션 초기화".누보 리치 요리법. 우분투.
- 제임스 헌트, 스테판 그레이버, 드미트리 레드코프, 스티브 랑가체크(2012-11-12)."Rebirth 사용자 작업 및 PID 추적". Ubuntu Raring Upstart 사용자 세션. 우분투.
- 네이선 윌리스(2013-04-17). 사용자 세션 시작. LWN.
systemd
. 시스템 매뉴얼 페이지. freedesktop.org.