시스템 서비스를 통한 중지

시스템 서비스를 통한 중지

짧은 버전:즉시 종료를 트리거하도록 시스템적으로 제어되는 서비스를 얻으려면 어떻게 해야 합니까?


다음으로 끝나는 (fork/exec'd) 쉘 스크립트를 통해 특정 이벤트에 대한 응답으로 임의의 작업을 수행할 수 있는 데몬이 있습니다.

exec halt -p

또는 더 구체적으로 , exec $@하지만 이 경우에는 $@입니다 halt -p. 나는 또한 다음을 시도했습니다.

  • shutdown now
  • systemctl halt.

이것이 작동하는 동안 일반적으로 몇 초 밖에 걸리지 않는 종료가 몇 분 정도 걸리는 문제가 있는 것 같습니다. 나는 systemd가 halt요청 시 정중하게 죽지 않는 서비스(자체)의 하위 프로세스를 기다리고 있기 때문이라고 생각합니다 . 즉, 그것은 자신의 꼬리를 쫓는 일종의 뱀 시나리오입니다.

서비스에 이(가) 없으며 ExecStop입니다 Type=forking.

답변1

man systemd.kill옵션 에 대한 설명은 다음 과 같습니다 KillMode.

KillMode=

이 장치의 프로세스를 종료하는 방법을 지정합니다. 다음 중 하나통제그룹, 프로세스, 혼합, 없음.

로 설정한 경우통제 그룹,이 장치의 제어 그룹에 남아 있는 모든 프로세스는 장치 중지 시 종료됩니다(서비스의 경우: 로 구성된 대로 중지 명령이 실행된 후 ExecStop=).

이는 사용자 정의 ExecStop자체가 도움이 되지 않음을 의미하지만 다음과 같습니다.

로 설정한 경우프로세스, 메인 프로세스 자체만 종료됩니다.

로 설정한 경우없음, 프로세스가 종료되지 않습니다. 이 경우 장치 정지 시 정지 명령만 실행되며,

따라서 ExecStop와 함께 사용할 수 있습니다 KillMode=none. 이는 데몬이 영구 프로세스를 시작한 경우 해당 프로세스를 대상으로 하지만 halt. 내 경우에는 그렇지 않으며 데몬 자체에는 SIGTERM핸들러가 있고 자식을 기다리지 않으므로 특별한 정리가 필요하지 않습니다. 따라서 블록 KillMode=process에 추가하면 [Service]문제가 해결됩니다. 데몬이 중지되고 가 halt완료되며 시스템은 몇 초 내에 정상적으로 종료됩니다.

관련 정보