데몬 프로세스를 시작하고 종료되면 다시 시작하는 서비스 단위 파일을 작성하고 싶습니다. 나는 가지고있다:
[Unit]
Description=lmgrd
[Service]
User=flexlm
Group=flexlm
ExecStartPre=/usr/bin/cp /nfs/lmgrd/* /lm/
ExecStart=/lm/lmgrd -c /lm/license.lic -l /lm/lmgrd.log
Restart=on-failure
RestartSec=3
RemainAfterExit=yes
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
파일을 복사하고 데몬을 시작하지만 데몬(lmgrd)을 종료하면 다시 시작되지 않습니다. 이 문제를 어떻게 해결할 수 있나요?
답변1
systemd가 서비스를 생각하기 때문에 다시 시작되지 않는 것 같습니다.아니요먼저 데몬 프로세스를 실행합니다. 데몬이 아직 살아 있는 동안 보면 systemctl status
"상태: 활성(종료)"이 표시되고 기본 PID가 나열되지 않을 수 있습니다.
기본적으로 FlexLM lmgrd는십자가(데몬) 시작; 초기 프로세스는 거의 즉시 종료되며 하위 프로세스는 추적해야 하는 "기본" 데몬입니다.
문제는 systemd가 아직 이에 대해 듣지 못했다는 것입니다. 서비스에 Type= 설정이 없으며 기본값은 실제로 Type=simple이며 systemd에게 추적을 지시합니다.초기의그러나 그것을 처리하십시오. 따라서 lmgrd가 데몬화되면 systemd는 "기본" 프로세스가 종료된 것으로 간주하고 일반적으로 서비스가 중지되었음을 보고합니다.
귀하의 경우에는 여전히 시스템화되어 있습니다.~인 척하다RemainAfterExit=yes가 설정되었기 때문에 서비스는 여전히 "활성" 상태이지만 실제로는 더 이상 추적되는 프로세스가 없습니다. 계속 실행 중인 lmgrd 프로세스는 남은 하위/작업자 프로세스로만 간주되며 해당 종료는 더 이상 서비스 상태에 영향을 주지 않습니다.
이 문제를 해결하려면,이 RemainAfterExit=
옵션 을 제거하세요그리고이 Type=forking
옵션을 추가하세요.후자는 "데몬화"되거나 "백그라운드로 분기"되는 서비스를 처리하는 올바른 방법입니다. (Systemd는 "PID 파일"이 필요하지 않은 기본 프로세스를 자동으로 결정합니다.)
또는 Type=simple을 유지할 수 있지만(그러나 RemainAfterExit는 제거함) 프로세스를 다음과 같이 구성합니다.아니요daemonize – FlexLM에는 -z
"포그라운드에서 실행"하는 옵션이 있습니다.
(Type=simple이 권장되는 경우가 많지만 항상 더 나은 선택은 아닙니다. Type=forking은 systemd에 알리는 장점도 있습니다.언제서비스는 이미 준비되어 있으며 Type=simple의 "단순성" 이점을 능가하는 경우가 많습니다. 이는 데몬이 "데몬화" 시간을 올바르게 측정한 경우(lmgrd는 그렇지 않음)와 시스템이 이 서비스에 의존하는 서비스로 구성된 경우에만 중요하지만(이 경우에는 그렇지 않을 수 있으므로 작동합니다 -z
.)
일반적으로 문제의 ExecStart가 실행되지 않는 한 RemainAfterExit=yes를 사용하지 마십시오.예상되는종료합니다. 대부분의 경우 Type=oneshot을 사용하여 이러한 서비스를 수행할 수도 있습니다. 예를 들어 nft
프로세스가 종료된 후에도 방화벽 규칙 세트가 로드된 상태로 유지되므로 nftables.service는 이 옵션을 사용할 수 있습니다. 그러나 수명이 긴 데몬의 경우 RemainAfterExit=yes의 유일한 효과는 부정적입니다. 이는 systemd가 실패를 무시하게 만듭니다.
추가 참고 사항으로 systemd확실히ExecStart에서 와일드카드 문자를 확장합니다(이 명령은 셸 없이 실행되므로 일반적인 셸 연산자는 작동하지 않습니다). 이 명령은 이라는 리터럴을 복사하려고 시도합니다 *
.
디렉터리의 내용을 반복적으로 복사하려면 이를 변경해야 합니다.
ExecStartPre=/usr/bin/cp -rv /nfs/lmgrd/. /lm/
또는 와일드카드 확장을 위해 셸을 실행합니다.
ExecStartPre=/bin/sh -c "cp -v /nfs/lmgrd/* /lm/"