체계적인 포크 대 단순?


25

첫 번째 systemd단위 파일을 쓰고 있습니다.

들어 Type: 거기에 몇 가지 선택이있다 forking, simple등 내가 읽기가 레드햇 문서 이 주제 (표 9.9)에,하지만 내가 어떤 옵션을 사용해야 할 때 아직 확실하지 않다.

어떤 지침?

답변:


48

명령 줄에서 서비스를 수동으로 시작할 때 ( nohup접두사 명령이나 &접미사를 사용하여 백그라운드에서 실행하지 않거나 다른 말로 ExecStart=하면 .service파일 행에 넣을 명령을 실행하면 ) 어떻게됩니까?

a) 서비스가 시작되고 계속 실행되고 Control-C를 누르거나 다른 방식으로 서비스를 중지 할 때까지 프롬프트가 표시되지 않습니다 Type = simple. 올바른 선택입니다.

b) 프롬프트가 반환되지만 서비스가 백그라운드에서 계속 실행되는 경우 (즉, 서비스가 자체적으로 데몬을 초기화 Type = forking하는 경우) 올바른 선택입니다.

c) 서비스가 작업을 수행하고 아무 것도 실행하지 않고 프롬프트로 돌아가는 경우 (즉, 서비스가 일부 커널 설정을 조정하거나 다른 것에 명령을 보내거나 유사한 것을 수행함) Type = oneshot아마도 올바른 선택 일 것입니다. 이 경우, ExecStart서비스 중 어떤 것이 "설정" ExecStop하는 명령 일 수 있으며, "설정 해제"하는 해당 명령이 될 수 있습니다. 이 유형은 일반적으로의 이점을 가지 RemainAfterExit=true므로 systemd는 가장 최근의 "설정"또는 "설정 해제"여부에 따라이 서비스의 "상태"를 추적합니다.

다른 Type값은 특별한 경우입니다. 예를 들어, 서비스가 D- 버스 연결을 사용하는 Type = dbus경우 최선의 선택 일 수 있습니다. 그것은 systemd사실 을 알고, systemd는 D-Bus에서이 서비스의 존재에 의해이 서비스 (및 그에 의존하는 모든 것)를 추적 할 것입니다.

를 사용하려면 Type = notify프로세스가 환경 변수에 지정된 Unix 소켓에 연결하고 $NOTIFY_SOCKET필요할 때마다 해당 소켓에 메시지를 작성하여 상태를보고 할 수 있어야합니다. 또한 서비스 파일은 NotifyAccess통지 소켓에 대한 액세스 권한을 적절하게 부여 하는 옵션을 지정해야합니다 .

이러한 메시지를 보내는 데 사용할 수 있는 명령 줄 유틸리티 systemd-notify와 C 라이브러리 함수 sd_notify(3)가 있지만, 둘 중 어느 것도 요구 사항에 적합하지 않으면 자신의 메시지 보낸 사람을 구현할 수 있습니다. 필요한 메시지는 매우 간단하며 쉘 변수 할당과 같습니다. 예를 들어 서비스가 성공적으로 시작을 완료했으며 들어오는 요청을 처리 할 준비가되었음을 알리려면 서비스는 출력과 동등한 문자열 printf "READY=1\n"을 소켓에 보내야합니다 . man 3 sd_notify인식 된 메시지에 대한 자세한 내용을 참조하십시오 .

참고 : 많은 Unix 스타일 시스템에 이식 가능하도록 설계된 많은 서비스 응용 프로그램은 기본적으로 b)처럼 동작 할 수 있지만 a) 옵션 (일반적으로 "포크하지 않음", "계속 실행"으로 설명)을 추가하여 작동하도록 만들 수 있습니다. 포 그라운드에서 ","디몬을 초기화하지 마십시오 "등). 이 경우 옵션에 다른 부작용이 없으면 옵션을 추가하고 a) 유형 동작을 사용하는 것이 좋습니다 systemd.


시작한다고 가정 apache하면 어떤 유형을 사용해야합니까?
kittygirl

2
음, 어떻게 수동으로 시작하겠습니까? apachectl start아마도 루트 로 실행함으로써 ? 해보고 무슨 일이 일어나는지보십시오. 그런 다음 내 대답에서 a), b) 또는 c)를 선택하십시오. 프롬프트가 반환되고 Apache가 계속 실행 중이므로 b)가 답이 될 것입니다.
telcoM

나는 당신이 당신의 대답에 설명을 정말 좋아합니다. 의 경우에 대한 또 다른 평범한 영어 설명을 추가 하시겠습니까 Type=notify?
양키

1
Type=notify추가 설명 .
telcoM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.