해결된 질문
작성
·
61
·
수정됨
0
안녕하세요
java 프로세스를 생성하니 생각대로 sshd로 접속한 프로세스 하위로 java 프로세스가 생성되는걸 볼 수 있었습니다.
996 996 996 ? 00:04:20 sshd
279106 279106 279106 ? 00:00:00 sshd-session
279140 279106 279106 ? 00:00:00 sshd-session
279141 279141 279141 pts/0 00:00:00 bash
279253 279253 279141 pts/0 00:00:37 java
여기서 java 프로세스를 백그라운드로 실행한 상태였는데 접속한 sshd 프로세스를 끊어버리니 systemd 하위로 간 것을 볼 수 있었습니다.
1 1 1 ? 00:01:25 systemd
996 996 996 ? 00:04:20 sshd
279309 279309 279309 ? 00:00:00 sshd-session
279343 279309 279309 ? 00:00:00 sshd-session
279344 279344 279344 pts/0 00:00:00 bash
279362 279362 279344 pts/0 00:00:00 ps
279253 279253 279141 ? 00:00:37 java
여기서 java 프로세스의 부모가 sshd 하위가 아니라 systemd 하위로 간 이유가 궁금하네요
좀 더 정확히는 부모가 결정되는게 어떤 기준으로 결정되는지 궁금합니다
부모가 죽었으면 그 바로 위 부모가 새로운 부모가 되는 것인지요..?
시간이 날 때마다 보고있습니다
감사합니다
답변 3
0
0
부모 프로세스가 종료되면, 그 자식은 systemd(PID 1)의 자식이 됨 (자동)
바로 위 상위 부모가 되는 게 아니라, 항상 init/systemd가 부모가 됨
이건 리눅스 커널의 프로세스 고아 관리 메커니즘에 따른 것
(java 자체가 리눅스 커널에서 동작하기 때문에 그래요.)
0
안녕하세요, 인프런 AI 인턴입니다. jdyj님.
Java 프로세스가 sshd
로 시작했다가 systemd
아래로 이동하는 현상에 대해 궁금하신 것 같습니다. 리눅스에서 프로세스의 부모가 어떻게 결정되는지에 대해 설명드리겠습니다.
프로세스 생성: 적절히 작동하는 시스템에서 모든 프로세스는 특정 부모 프로세스를 가집니다. 여러분이 본 것처럼 Java 프로세스는 처음에 sshd
하위에서 생성되었고, 이는 해당 SSH 연결을 통해 실행했기 때문입니다.
부모 프로세스의 종료: 만약 부모 프로세스가 종료되면, 리눅스는 고아가 된 자식 프로세스를 처리하기 위해 특별한 메커니즘을 사용합니다. 일반적으로 이러한 고아 프로세스의 새로운 부모가 init
프로세스가 되며, Modern Linux에서는 systemd
가 이 역할을 대신합니다. 이는 systemd
가 프로세스 ID 1을 가지며 모든 고아 프로세스의 부모가 되도록 디자인된 이유입니다.
고아 프로세스를 인수하는 이유: 이는 메모리 관리를 효율적으로 하고 시스템 상태를 안정적으로 유지하기 위함입니다. systemd
는 이 고아 프로세스를 추적하고 관리하여 잠재적인 메모리 누수나 기타 문제가 발생하지 않도록 합니다.
추가로 관련 사항을 더 깊이 이해하고 싶으시다면, 리눅스의 프로세스 관리와 관련된 내용을 다룬 강의를 참고해보시는 것도 좋은 방법입니다.
유사한 질문과 답변을 참고하실 수 있도록 이전 게시물을 추천드립니다:
- 리눅스 시스템에서 프로세스의 부모 변경에 대해
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.