배경
systemd
새로운 서비스에 대한 스크립트 를 작성하라는 요청을 받았습니다.이 서비스 foo_daemon
는 때때로 “나쁜 상태”에 빠지고 SIGTERM
(사용자 지정 신호 처리기 때문에) 죽지 않을 것 입니다. 개발자는 다음을 통해 서비스를 시작 / 중지 / 다시 시작하라는 지시를 받으므로 문제가됩니다.
systemctl start foo_daemon.service
systemctl stop foo_daemon.service
systemctl restart foo_daemon.service
문제
때로는 foo_daemon
나쁜 상태에 빠지기 때문에 다음을 통해 강제로 종료해야합니다.
systemctl kill -s KILL foo_daemon.service
의문
어떻게 내가 설정 내 systemd
을위한 스크립트를 foo_daemon
되도록, 정지에 대한 사용자 시도 / 서비스를 다시 시작 때마다 systemd
것입니다 :
foo_daemon
via 의 정상적인 종료를 시도하십시오SIGTERM
.- 종료 / 종료
foo_daemon
가 완료 될 때까지 최대 2 초를 제공하십시오 . - 프로세스가 아직 활성 상태 인 경우 강제로
foo_daemon
비아를 종료SIGKILL
하십시오 (따라서 PID가 재활용 될 위험이없고 잘못된 PID에 대해systemd
문제 가 발생하지 않습니다SIGKILL
). 우리가 테스트하는 장치는 수많은 프로세스를 빠르게 생성 하므로 문제를 일으키는 PID 재활용에 대해서는 드물지만 매우 우려됩니다. - 실제로 PID 재활용에 대해 편집증을 앓고
SIGKILL
있다면 재활용 PID를 죽일 염려없이 프로세스 PID에 대해 스크립트를 발행 하는 것이 좋습니다.
답변
systemd는 이미 이것을 즉시 지원하며 기본적으로 활성화되어 있습니다.
사용자 정의 할 수있는 유일한 작업은 시간 초과입니다 TimeoutStopSec=
. 예를 들면 다음과 같습니다.
[Service]
TimeoutStopSec=2
이제 systemd는 SIGTERM을 전송하고 서비스가 종료 될 때까지 2 초 동안 기다립니다. 그렇지 않으면 SIGKILL을 전송합니다.
서비스가 시스템을 인식하지 못하는 경우을 사용하여 PID 파일의 경로를 제공해야 할 수 있습니다 PIDFile=
.
마지막으로, 데몬이 많은 프로세스를 생성한다고 언급했습니다. 이 경우 KillMode=control-group
cgroup의 모든 프로세스에 신호를 보내도록 설정 하고 systemd 할 수 있습니다.
답변
아무도 필요 없음을 언급하지 않았 Type=oneshot
으므로 시간 초과 실패로 인해 종료되는 완전한 예제가 있습니다.
[Unit]
Description=timeout test
[Service]
Type=oneshot
TimeoutStartSec=2
ExecStart=/bin/sleep 10