systemctl이 Restart=always 준수를 중단해야 합니까?

systemctl이 Restart=always 준수를 중단해야 합니까?

"systemctl stop docker.service"를 실행할 때 "Restart=always"를 준수해야 하나요?

내 이해(그리고 이것은 제한적)는 systemctl stop이 종료 코드 0으로 중지되어야 한다는 것입니다. 그런 다음 "Restart=always"가 구성되어 있기 때문에 docker.service가 다시 시작될 것으로 예상합니다. 즉, 종료 코드가 무엇이든 다시 시작해야 하지만 이런 일이 발생하지 않는 것 같습니다.

systemctl stop은 특별한 경우입니까? 그렇다면 상태 코드 0으로 dockerd를 종료하여 "Restart=always"가 올바르게 작동하는지 어떻게 테스트할 수 있나요?

답변1

귀하의 의견에 감사드립니다. 위의 내용(내 지식 부족을 바탕으로 한 가장 좋은 설명)을 가지고 놀면서 동작은 다음과 같습니다.

  • 위의 Eval/gdp 스크립트는 docker.service에서 작동하는 것 같습니다. dockerd 프로세스가 종료되고 다시 시작됩니다. 프로세스가 상태 0으로 종료되었음을 나타내는 메시지가 /var/log/messages에 기록되지 않습니다. 종료 상태 1을 사용하도록 스크립트를 변경하면 메시지 로그 파일에 status=1로 기록되고 서비스도 다시 시작됩니다.
  • SIGTERM은 또한 docker.service를 중지하고 /var/log/messages에 종료 코드 상태를 쓰지 않고 프로세스를 다시 시작하도록 합니다.
  • systemctl stop docker.service로 인해 프로세스가 중지되고 다시 시작되지 않습니다.
  • systemctl stop systemd-udevd는 프로세스를 중지하고 다시 시작하지 않게 합니다. 즉, SIGSTOP처럼 작동합니다.

이 마지막 점은 STOP 명령이 restart=always를 지원하도록 설계되지 않았음을 나타내는 것 같습니다.

답변2

아니요. 잘 모르겠습니다.

udev와 같이 libc와 연결된 프로그램의 경우:

eval $(systemctl show -p MainPID systemd-udevd)
gdb -p $MainPID
p (void)_exit(0)
quit

그러나 Docker는 C++로 작성되어 goC 함수를 호출하는 데 매우 적합하지 않습니다(그리고 아마도 자체 시스템 호출 구현을 사용합니까?). 그래서 이것이 dockerd에서 작동하는지 모르겠습니다.

Restart=always생각대로 작동하는지 다시 확인하고 싶다면 systemd-udevd.service가 이미 사용되어 있습니다 Restart=always. 따라서 Restart=always위의 내용을 데모에 사용할 수 있습니다. 그것은 나를 위해 작동합니다 :-).

관련 정보