저는 현재 "Unix 환경의 고급 프로그래밍"을 읽고 있습니다. 연습 중 하나에서는 다음과 같이 말합니다.
세션 리더가 아닌 유일한 사용자 수준 데몬 프로세스는 rsyslogd 프로세스입니다. syslogd 데몬이 세션 리더가 아닌 이유를 설명하세요.
그러나 이것을 직접 확인하러 갔을 때 내 시스템(Linux 4.4)에서는 이것이 실제로 세션 리더라는 것을 발견했습니다(PID == SID이기 때문에).
UID PID PPID PGID SID CMD
syslog 1171 1 1171 1171 /usr/sbin/rsyslogd -n
이게 시스템적인 일인가요? 모두가 systemd 편승을 했기 때문에 이 책에 있는 정보 중 일부는 약간 오래된 정보이며 주로 고전적인 System V init에 대해 논의합니다. 아니면 작동 방식을 변경했을 수도 있습니다.
이 책은 분명히 그것이 왜 다른지 보여주고 싶어하므로 역사적으로 왜 과거에 컨퍼런스 호스트가 되지 않았는지, 그리고 왜 지금인지 아는 사람이 있다면 좋을 것입니다.
답변1
편집하다
실제로 rsyslogd 4.2.0을 실행하는 오래된 우분투 10.04 시스템을 살펴보았습니다.
이는 setsid()
전혀 호출하지 않고(따라서 이를 실행하는 프로세스에서 sid를 상속함) 대신 호출합니다(여기서는 strace
출력에서).
19391 open("/dev/tty", O_RDWR|O_LARGEFILE|O_CLOEXEC) = 0
19391 ioctl(0, TIOCNOTTY) = 0
터미널에서 분리되었습니다.
보고 있다소스 코드HAVE_SETSID
이 작업은 설정되지 않은 경우에만 수행됩니다. 분명히 Linux는 setsid()
수십 년 동안 존재해왔기 때문에 뭔가 잘못되었습니다.
HAVE_SETSID
이제 소스 코드를 더 자세히 살펴보면 빌드 프로세스가 처음부터 지원을 확인하지 않기 때문에 설정되지 않는다는 것입니다 .setsid()
오류(오타: setsid
autoconf 파일에 철자가 있음)는 다음과 같습니다.setid
2013년에 수리됨(rsyslogd 7.5.3에서 처음 출시됨)
(그런데, 참조해HP/UX 정보이전 코드에서는 작성자가 문제가 있음을 알고 있었음을 나타냅니다(그러나 나중에까지 조사하지 않음).
사람들이 정보가 유용하다고 생각할 수 있으므로 아래에 원래 답변을 남겨주세요.
대략적인 추측:
세션 리더이고 플래그 tty
없이 장치를 열면 터미널을 제어하는 프로세스가 됩니다.O_NOCTTY
setsid()
그렇기 때문에 애플리케이션(데몬으로 실행되도록 설계되지 않은)을 실행하여 데몬으로 실행하려고 할 때 프로세스가 실수로 데몬 프로세스가 되지 않도록 실행하기 전에 또 다른 포크를 수행하는 것이 좋습니다 . . 터미널 컨트롤러(어떤 이유로 tty 장치가 열린 경우).
syslogd
일반적으로 tty 장치는 사용자 메시지를 보내기 위해 열리므로 책에서 syslogd가 세션 리더가 아니라고 말하고 O_NOCTTY 플래그가 없을 때 syslogd 구현의 동작을 설명합니다(해당 플래그는 적어도 2000년 이후부터 사용되었지만). 1980년대) 이후).
또 다른 접근 방식은 syslogd에서 열리는 모든 파일이 O_NOCTTY로 열리는지 확인하는 것입니다. 이는 아마도 사용자가 수행하는 작업 rsyslogd
(및 와 아무 관련이 없는 작업 systemd
)일 것입니다.