systemctl + Restart=always는 무엇을 의미하나요?

systemctl + Restart=always는 무엇을 의미하나요?

서비스를 구성했습니다 - calc_mem.service

다음과 같이

Restart=on-failure
RestartSec=5
StartLimitInterval=400
StartLimitBurst=3

내 이해에 따르면 위 구성은 다음을 수행해야 합니다.

오류로 인해 서비스가 종료되면 서비스는 3번의 재시도를 갖습니다.

서비스는 시작하기 전에 5초 동안 기다립니다.

또한 "다시 시작"이 다음과 같을 수도 있다는 것을 알았습니다.

Restart=always

장애가 발생하면 서비스를 다시 시작해야 한다는 점은 이해할 수 있지만, 이는 무엇을 의미합니까 Restart=always?

이 경우 다음을 설정해야 합니다. Restart=always

답변1

이것systemd.service매뉴얼 페이지값에 대한 설명 Restart=과 재시작을 유발하는 옵션에 대한 표가 있습니다. Always캡에 있는 지침을 거의 따르십시오.

로 설정하면 always정상적으로 종료되거나, 신호에 의해 비정상적으로 종료되거나, 타임아웃되더라도 서비스를 다시 시작한다.

이 기능에 대한 사람들의 생각은 잘 모르겠지만, 예를 들어 서비스가 고정된 기간 동안만 실행되거나 고정된 수의 요청을 처리한 다음 가능한 리소스를 피하기 위해 중지되도록 구성되어 있다고 가정할 수 있습니다. 누출. systemd가 다시 시작하도록 하면 서비스 자체의 구현이 더 명확해집니다.

어떤 의미에서 우리는 이유를 물을 수도 있습니다.아니요systemd에 이 옵션을 포함합니다. 장애 발생 시 서비스를 다시 시작하는 기능이 있으므로 서비스를 다시 시작하는 옵션도 포함될 수 있습니다.언제나, 누군가 필요할 경우를 대비해. 정책이 아닌 도구를 제공하십시오.

또한 "성공적인 종료"는 여기에서 상당히 광범위하게 정의되어 있습니다.

로 설정하면 on-success서비스 프로세스가 완전히 종료된 경우에만 다시 시작됩니다. 이 경우 깨끗한 종료는 종료 코드 0 또는 signal SIGHUP, SIGINT, SIGTERM또는 중 하나를 의미합니다 SIGPIPE.[...]

SIGHUP프로세스를 다시 시작하도록 요청하는 일반적인 방법이지만 처리되지 않고 프로세스가 종료됩니다. 따라서 Restart=always서비스 자체에서 지원하지 않는 경우에도 (또는)을 사용하여 다시 시작할 수 있습니다.Restart=on-successSIGHUP

always또한 매뉴얼 페이지를 읽는 한 제한을 무시하고 설정한다는 의미는 아닙니다 .StartLimitIntervalStartLimitBurst

StartLimitIntervalSec=서비스 다시 시작에는 장치 시작 속도 제한이 적용되고 구성됩니다 StartLimitBurst=. 자세한 내용은 systemd.unit(5)을 참조하세요. 다시 시작된 서비스는 시작 제한에 도달한 후에만 실패 상태가 됩니다.

답변2

로 설정한 경우실패의 경우, 프로세스가 0이 아닌 종료 코드로 종료되거나, 신호(코어 덤프 포함, 위의 4개 신호 제외)에 의해 종료되거나, 작업 시간 초과(예: 서비스 다시 로드)될 때 서비스가 다시 시작됩니다. 구성된 감시 시간 초과가 트리거될 때. [...]로 설정된 경우언제나, 서비스가 정상적으로 종료되었는지, 신호에 의해 비정상적으로 종료되었는지, 타임아웃되었는지에 관계없이 서비스가 다시 시작됩니다.

에서 발췌https://www.freedesktop.org/software/systemd/man/systemd.service.html

따라서 설정하면 on-failure완전히 종료할 때 다시 시작되지 않습니다.

답변3

@JdeBP는 이것을 보는 또 다른 방법이 있다고 제안합니다.

Restart=always더 간단합니다. 구현하기 쉽고 이해하기 쉽습니다. 서비스가 종료 코드 0( EXIT_SUCCESS)으로 종료되었는지 확인하는 이유는 무엇입니까? 서비스가 종료되어서는 안 되는 종료 코드 0으로 종료되는 이상한 버그/오류가 있을 수도 있습니다.

답변 1: 일부 단위는 사용할 수 없습니다 Restart=always. 특히 유휴 시간 초과 후 서비스가 종료되는 경우입니다.

흥미롭게도, 버그/오류로 인해 그러한 서비스가 "성공적으로" 종료되는 경우(종료되어서는 안되는 경우) 그다지 중요하지 않습니다. 유휴 시간 초과는 새 요청이 있을 때 서비스가 자동으로 시작되도록 설정되었음을 의미하기 때문입니다.

그러나 Restart=on-failure일부 구성에서는 유휴 상태일 때 종료될 수 있지만 다른 구성에서는 종료될 수 없는 서비스에 사용될 수 있습니다. systemd-networkd이런 이유로 사용하세요.

답변 2: 시스템 관리 관행에는 이를 방지하기 위해 메시지 서비스 프로세스를 종료하거나 차단하는 것이 포함될 수 있습니다. 때때로 사람들은 간단한 명령 kill을 사용 하지만 apachectl.Restart=on-failuresystemd

그러나 systemd이상한 위치에 있기 때문에 그들은 Restart=always프로젝트 내에서 대부분의 장기 실행 서비스에 대해 이것이 설정하는 방식을 지지합니다 systemd. systemd이는 서비스 정의를 이해하려고 할 때 별로 도움이 되지 않는 것 같습니다.

관련 정보