![배경](https://rvso.com/image/726372/%EB%B0%B0%EA%B2%BD.png)
배경
나는 때때로 "나쁜 상태"에 빠지고 (사용자 정의 신호 처리기로 인해) 종료되지 않는 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
을(를 ) 통해 정상적으로 종료해 보세요SIGTERM
.- 종료/종료가 완료되는 데 최대 2초가 소요됩니다
foo_daemon
. foo_daemon
프로세스가 아직 살아 있으면 via 강제 종료를 시도합니다 (따라서 PID가 재활용되거나 잘못된 PID에 대한 문제가 발생할SIGKILL
위험이 없습니다 ). 우리가 테스트하고 있는 장치는 수많은 프로세스를 빠르게 생성/포크합니다.systemd
SIGKILL
따라서 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