systemd를 통해 서비스 중지

systemd를 통해 서비스 중지

간결한 버전:systemd가 제어하는 ​​서비스를 즉시 종료하는 방법은 무엇입니까?


(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

관련 정보