배경

배경

배경

나는 때때로 "나쁜 상태"에 빠지고 (사용자 정의 신호 처리기로 인해) 종료되지 않는 systemd새로운 서비스에 대한 스크립트를 생성하라는 요청을 받았습니다 . 이는 개발자에게 다음을 통해 서비스를 시작/중지/다시 시작하도록 지시하므로 문제가 됩니다.foo_daemonSIGTERM

  • 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_daemonsystemd

  • foo_daemon을(를 ) 통해 정상적으로 종료해 보세요 SIGTERM.
  • 종료/종료가 완료되는 데 최대 2초가 소요됩니다 foo_daemon.
  • foo_daemon프로세스가 아직 살아 있으면 via 강제 종료를 시도합니다 (따라서 PID가 재활용되거나 잘못된 PID에 대한 문제가 발생할 SIGKILL위험이 없습니다 ). 우리가 테스트하고 있는 장치는 수많은 프로세스를 빠르게 생성/포크합니다.systemdSIGKILL따라서 PID 재활용이 문제를 일으키는 경우는 드물지만 매우 실제적인 우려가 있습니다.
  • SIGKILL실제로 PID 재활용에 대해 편집증이 있는 경우 재활용된 PID를 죽이는 것에 대해 걱정하지 않고 프로세스의 PID에 대해 발행하는 스크립트는 괜찮습니다 .

답변1

systemd는 이미 이것을 기본적으로 지원하며기본적으로 활성화됨.

사용자 정의할 수 있는 유일한 것은 시간 초과입니다 TimeoutStopSec=. 로 수행할 수 있습니다. 예를 들어:

[Service]
TimeoutStopSec=2

이제 systemd는 SIGTERM을 보내고 서비스가 종료될 때까지 2초를 기다린 후 종료되지 않으면 SIGKILL을 보냅니다.

서비스가 시스템을 인식하지 못하는 경우 PIDFile=.

마지막으로 데몬이 많은 프로세스를 생성한다고 언급했습니다. 이 경우 설정을 원할 수 KillMode=control-group있으며 systemd는 cgroup의 모든 프로세스에 신호를 보냅니다.

답변2

아무도 need 를 언급하지 않았으므로 Type=oneshot다음은 시간 초과 실패로 인해 종료되는 완전한 예입니다.

[Unit]
Description=timeout test

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

관련 정보