[server] SIGKILL을 통해 종료되도록 버기 시스템 서비스 구성

배경

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_daemonvia 의 정상적인 종료를 시도하십시오 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-groupcgroup의 모든 프로세스에 신호를 보내도록 설정 하고 systemd 할 수 있습니다.


답변

아무도 필요 없음을 언급하지 않았 Type=oneshot으므로 시간 초과 실패로 인해 종료되는 완전한 예제가 있습니다.

[Unit]
Description=timeout test

[Service]
Type=oneshot
TimeoutStartSec=2
ExecStart=/bin/sleep 10


답변