추가 읽기

추가 읽기

man 7 daemon

기존 SysV 데몬이 시작되면 초기화의 일부로 다음 단계를 수행해야 합니다. 이 단계는 최신 데몬(아래 참조)에는 필요하지 않으며 SysV 호환성이 필수인 경우에만 구현해야 합니다.

[...]

6. 하위 프로세스에서 setid()를 호출하여 터미널에서 분리하고 독립 세션을 만듭니다.

7. 하위 프로세스에서 fork()를 다시 호출합니다.데몬이 터미널을 다시 획득하지 않도록 하세요..

그러나 이를 SysV 호환성의 흔적이 없는 부팅 프로세스와 비교해 보세요.

$ ps -efj
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         1     0     1     1  0 May10 ?        00:06:44 /sbin/init
...
root       185     1   185   185  0 May10 ?        00:09:48 /lib/systemd/systemd-journald
root     16434     1 16434 16434  0 May26 ?        00:00:11 /usr/sbin/rsyslogd -n

rsyslog.service두 프로세스 모두 systemd-journal.service세션 리더입니다(SID = PID).

이러한 프로그램이 TTY에 로그인하도록 구성된 경우 TTY를 제어 터미널로 사용하고 TTY가 Ctrl+C를 각각 정지/수신할 때 원치 않는/치명적인 신호를 수신하는 것으로 보입니다. TTY 파일을 열 때 O_NOCTTY를 설정하는 것을 기억하지 않는 한.

프로그램이 사용자 정의 파일에 메시지 쓰기를 지원하는 경우 SysV 호환성 없이 시스템 서비스로 실행되도록 프로그램을 작성하거나 변환할 때 이는 사소한 함정인 것 같습니다. 시스템화된 스타일을 옹호하는 이 문서에서는 이 점을 지적하지 않는 것 같습니다. 문서에서는 SysV에서 이러한 상황을 피하기 위해 이중 포크를 사용해야 한다고 주장하면서 그 반대를 암시하고 있으며 기본 systemd 서비스가 사용할 단계를 설명할 때 이를 언급하지 않습니다.

그렇죠? systemd는 내가 간과하고 있는 것에 대해 일부 보호 기능을 제공합니까, 아니면 systemd 문서의 다른 곳에서 문제가 지적되어 있습니까?

답변1

systemd는 이러한 상황에 대해 어느 정도 보호 기능을 제공합니까[...]?

당신은 그래야 한다고 생각합니다. 대신 와 같은 설정 TTYPath및 서비스를 고려하십시오 [email protected]. 실제로 단말기를 제어할 수 있는 능력을 얻는 것은필요한, 서비스 관리에 정확히 필요한 TTY 로그인 서비스가 포함될 수 있도록 합니다.

실제로 이런 일이 발생하지 않도록 방지하는 것은 모든 곳에서 제어 터미널의 자동 할당을 포기 open()하고 오래된 의미를 포기하는 것입니다. 또는회의예방하세요. Linux에서는 그렇지 않지만 FreeBSD, NetBSD, OpenBSD 및 Hurd에서는 현재 O_NOCTTY플래그가 open()완전히 중복됩니다. 이것오직제어 터미널을 얻는 방법은 ioctl(…TIOSCTTY).

동시에 Linux에서 개발된 습관은 systemd 이전부터 오랫동안 존재해 왔습니다.O_NOCTTY어디에나. ☺

(예, GNU 및 musl C 라이브러리는 이 기능을 제공하지 않습니다 fopen(). 이것이 이것이 여전히 유용한 메커니즘인 여러 이유 중 하나입니다 fdopen().)

nosh 도구 세트를 사용한 서비스 관리는 service-manager이에 대해 약간 다른 접근 방식을 취합니다. 항상 데몬을 세션 리더로 설정하는 대신 각 서비스에는 자체 커널 세션 개체가 할당되며 이는 사용되지 않으며 특정 서비스만 setsid명시적으로 연결됩니다. 예를 들어, 제어하는 ​​서비스를 설정하는 것입니다. 터미널과 서비스. (서비스 소스에 설명된 대로 자신을 호출합니다.)ttylogin@*open-controlling-ttyagetty@*agettygetty@*mgettysetsid()

추가 읽기

답변2

systemd는 서비스 프로그램이 제어 터미널을 얻지 못하도록 보호하지 않습니다. 사용자는 자신이 지정한 로그 파일을 열 때 자신을 보호하기 위해 이 플래그를 사용해야 합니다 O_NOCTTY.

$ rpm -q systemd
systemd-238-8.git0e0aa59.fc28.x86_64

$ systemctl cat test
# /etc/systemd/system/test.service
[Service]
Type=simple
ExecStart=/bin/sh -c "exec cat </dev/tty10 >/dev/tty10"

$ systemctl status test
● test.service
   Loaded: loaded (/etc/systemd/system/test.service; static; vendor preset: disabled)
   Active: active (running) since Fri 2018-06-01 11:28:41 BST; 1min 35s ago
 Main PID: 12173 (cat)
    Tasks: 1 (limit: 4915)
   Memory: 180.0K
   CGroup: /system.slice/test.service
           └─12173 cat

Jun 01 11:28:41 alan-laptop systemd[1]: Started test.service.

$ ps -ejf
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
...
root     12173     1 12173 12173  0 11:28 tty10    00:00:00 cat

또한 tty10으로 전환하고 Ctrl+C를 누르면 프로세스가 중지되는 것도 확인했습니다 cat.

관련 정보