배경
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에 대해 스크립트를 발행 하는 것이 좋습니다.
2
2 초 안에 4 백만 개 이상의 PID를 롤링 할 수있을 정도로 프로세스를 빠르게 생성하더라도 systemd 는 "이 pid가 아직 살아 있습니까?이 pid가 아직 살아 있습니까?" 필요 하지 않기 때문에 ; 이미 직계 자식 프로세스가 아직 존재하는지 여부에 대해 이미 알고 있습니다 (일반 SIGCHLD 및 waitpid ()를 통해). 따라서 SIGTERM 이후에 프로세스가 종료 된 것을 확인하면 해당 시점에서 단순히 서비스를 '비활성'으로 표시합니다. SIGKILL을 확인, 대기 및 전송하는 데 전혀 영향을 미치지 않습니다.
—
grawity