제가 아는 한 다양한 기사를 통해여기, 데몬 프로세스에는 다음과 같은 특징이 있습니다.
- 상위 프로세스 ID는 1이어야 합니다.
- 이 프로세스에는 터미널이 연결되어서는 안 됩니다.
- 프로세스의 프로세스 ID, 세션 ID, 프로세스 그룹 ID가 동일해야 합니다.
내 시스템의 일부 데몬에서는 작동하는 것 같습니다. 그러나 avahi-daemon
내 시스템의 PID는 678이고 다른 두 ID는 677입니다. 왜 그럴까요?
데몬을 식별하는 다른 기능도 있습니까?
답변1
당신의 성격은 너무 제한되어 있습니다. 여기서 핵심 개념은 다음과 같습니다.데몬은 백그라운드 프로세스이므로 터미널을 제어하는 프로세스가 될 수 없으며 제어 터미널을 소유할 수도 없습니다.. 이 간단한 "규칙"을 사용하면 데몬이 터미널 열기/닫기 및 사용자 로그인/로그아웃 후에도 살아남을 수 있습니다.
각 터미널에는 해당 터미널을 통해 생성된 프로세스 집합인 제어 세션이 있습니다. 세션 리더(일반적으로 쉘)는 터미널의 제어 프로세스입니다. 이 터미널은 쉘의 제어 터미널로 간주됩니다.
왜냐하면 당신은 읽을 수 있을 것이기 때문이다.이것은 내 질문 중 하나에 대한 답변입니다., 터미널이 닫히면 SIGHUP
제어 프로세스(셸)에 신호를 보냅니다. 이로 인해 일반적으로 셸이 SIGHUP
수신한 데이터를 모든 작업에 재전송 하므로 셸에 연결된 모든 프로세스가 종료됩니다 .
악마~ 해야 하다사용자 로그인 및 로그아웃이 유지되어야 하므로 이 체인을 피하세요. 따라서 상위 셸에서 분리되어야 합니다. 일반적인 접근 방식은 이중 포크입니다.
- 데몬은 하위 프로세스를 생성합니다.
- 데몬 프로세스는 "기본"/상위 프로세스를 종료합니다.
- 아이에 대한 모든 작업이 완료되었습니다.
쉘은 하위 프로세스를 추적하지 않기 때문에 SIGHUP
나머지 데몬에 메시지를 보내지 않습니다. 이제 이 설정에서 손자(데몬)는 기본적으로 다음을 가져야 합니다.
- 다른 프로세스와 마찬가지로 자체 PID가 있습니다.
- 현재 종료된 상위 항목의 PGID입니다.
- 가장 가까운 하위 수확기의 PPID이며 일반적으로 PID 1입니다.
- 현재 종료되는 상위 항목의 SID. 일반적으로 셸의 SID이기도 합니다.
상위 프로세스를 종료하는 것은 특별히 필요한 것은 아닙니다. 프로세스는 터미널과 함께 종료됩니다. 그러나 쓸모없는 프로세스를 피하려면 하위 프로세스가 작동하기 시작하기 직전에 상위 프로세스를 종료하는 것이 더 깔끔합니다.
이 경우 프로세스는할 수 있는데몬 프로세스라고 합니다. 터미널을 닫아도 종료되지는 않습니다. 그러나 데몬에 완전히 새로운 세션을 제공하는 것이 일반적입니다. API 수준에서는 setsid
시스템 호출을 사용하여 이 작업을 수행합니다. 사용된 후에는 프로세스에 다음이 포함되어야 합니다.
- 변경되지 않은 PID.
- 변경되지 않은 PPID(가장 가까운 하위 리퍼).
- 완전히 새로운 SID. 일반적으로 PID와 동일합니다.
- 동일한 그룹의 프로세스도 동일한 세션에 있어야 하므로 완전히 새로운 GID입니다.
답변2
이는 단순히 데몬의 상위 프로세스(pid 677)가 새 세션을 시작하고 분기되었으며 하위 프로세스(pid 678)가 해당 세션을 상속하여 계속 실행됨을 의미합니다.
이는 일부 래퍼 스크립트를 사용하여 무언가를 데몬화하는 경우(그리고 어떤 이유로 해당 목표가 실행되지 않는 경우 - 아마도 다시 시작을 처리하는 경우) 또는 단순히 프로세스가 안정적인 상태 상황에 들어가기 전에 다시 분기하기로 선택하기 때문에 발생할 수 있습니다.
내가 말하고 싶은 것은 과정이다.효과적으로PPID가 1이고 제어 단말이 없으면 데몬 프로세스이다. 세션 ID/프로세스 그룹 ID 제약 조건도 일반적으로 정확하지만 데몬 동작에는 실제로 필요하지 않습니다.