재로드시 데몬을 종료하고 다시 시작하도록 systemd를 구성하는 방법은 무엇입니까?


12

systemd를 사용하여 제어하려는 구식 데몬이 있습니다. 구성 파일이 변경되면 종료하고 다시 시작해야합니다. 즉, 구성 파일을 편집 한 후 systemctl reload MYSERVICE프로세스를 종료하고 다시 시작해야합니다.

시도 1 : 기본값을 사용해보십시오. 이것은 systemd에게 데몬을 시작하는 방법을 알려주지 만 다시로드하는 방법은 아닙니다.

[Service]
ExecStart=/usr/bin/MYSERVICE
Type=simple

결과적으로 작동하지만 다음 start과 같은 오류가 발생합니다.restartreload

# systemctl reload MYSERVICE
Failed to reload MYSERVICE.service: Job type reload is not applicable for unit MYSERVICE.service.

시도 2 : 프로세스를 종료하는 방법을 알려주십시오. 이것은 프로세스를 종료하지만 systemd는 프로세스를 다시 시작하지 않습니다.

[Service]
ExecStart=/usr/bin/MYSERVICE
Type=simple
ExecReload=/bin/kill -HUP $MAINPID

... 뒤에 ...

# systemctl daemon-reload
# systemctl reload MYSERVICE

... 프로세스를 종료하지만 자동으로 다시 시작되지는 않습니다.

시도 3 : ExecReload를 사용하여 프로세스도 다시 시작하십시오. 몇 가지 이유로 실패합니다.

ExecReload=/bin/kill -HUP $MAINPID ; /usr/bin/MYSERVICE

... 내가 얻는 오류 메시지 ... :

# systemctl daemon-reload
# systemctl reload MYSERVICE
Job for MYSERVICE.service failed because the control process exited with error code. See "systemctl status MYSERVICE.service" and "journalctl -xe" for details.

ReloadType = kill_and_restart 또는 그 밖의 운이 없을 것으로 기대합니다.

리로드 할 때 데몬을 죽이고 다시 시작하도록 systemd에 지시하는 방법은 무엇입니까?


이것이 정확히 맞지 않는 reload에 실제로 꽂혀 있어야합니까 ? 데몬을 현명하게 동작시킬 수 없습니까?
Michael Hampton

@MichaelHampton에게 감사드립니다. 그러나 이것은 프로그램을 다시 작성할 수있는 상황이 아닙니다. 도움이 되신 제안에 감사드립니다. 즉, 이것이 일반적인 시스템 사용 사례이며 표준 답변이 많은 사람들에게 도움이 될 것이라고 확신합니다.
TomOnTime

1
답이 누군가에게 도움이 될 것이라고 확신하므로 질문에 찬성했습니다. 이것이 일반적인 사용 사례인지 확실하지 않습니다. 거의 전 세계에 공개 된 날부터 거의 5 년 동안 체계화를 사용해 왔지만, 이런 종류의 시나리오를 시도하는 사람에 대한 소식을들을 수있는 것은 이번이 처음입니다. 세부 정보가 누락되어 무언가를 잘못 이해하고있을 수 있습니다.
Michael Hampton

답변:


16

대답은 "그렇지 않다"입니다. 그러나 좋은 소식이 있습니다.

systemd의 철학은 reload는 선택 사항이며 진정한 reload 기능이 없다면 정의되지 않은 채로 두어야합니다. "실제 재로드 기능"을 서비스를 종료하고 다시 시작하지 않거나 서비스가 PID를 변경하지 않는 재로드로 정의합니다. 다시 말해 systemd는 어떤 기능이 존재하는지 만 반영하려고합니다.

대신, systemctl reload-or-restart재로드가있는 경우 재로드를 수행하고 재로드가 없으면 재로드해야합니다.

맨 페이지에서 ...

   reload-or-restart PATTERN...
       Reload one or more units if they support it. If not, restart them
       instead. If the units are not running yet, they will be started.

   reload-or-try-restart PATTERN...
       Reload one or more units if they support it. If not, restart them
       instead. This does nothing if the units are not running. Note that,
       for compatibility with SysV init scripts, force-reload is
       equivalent to this command.

따라서 : (1) ExecReload를 비워두고, (2) 사용 systemctl reload-or-restart MYSERVICE하고, (3) 모두 설정해야합니다.

ExecReload를 사용하여 서비스를 종료하고 다시 시작하는 방법을 정의하려고하면 새로운 PID가 생겨 시스템이 혼동됩니다.


3

systemd의 철학은 reload선택 사항이며 systemd의 사용자는 모든 서비스에 대해을 reload호출하여 호출 해야하는지 또는 가짜 인지를 알아야합니다 restart.

따라서 귀하의 질문에 대한 답변은 "작동하지 않으며 작동하지 않아야합니다. 다음 상위 계층에서이 문제를 해결하십시오."

다시 말해, systemd는 기본 서비스가 진정한 재로드 기능, 즉 서비스를 종료하고 다시 시작하지 않거나 서비스를 PID로 변경하지 않는 재로드를 지원하는 경우 에만 " reload "를 구현하기를 원합니다 . 다시 말해 systemd는 어떤 기능이 존재하는지 만 반영하려고합니다.

당신은 스스로에게 물어볼지도 모릅니다 : 그러나 ExecReload서비스를 종료하고 다시 시작할 수있게 하여 "가짜"재 장전을 구현할 수 있다면 쉽지 않을까요? 그런 다음 systemctl reload FOO모든 서비스에 사용할 수 있으며 어떤 서비스를 지원하고 어떤 서비스를 지원하지 않았는지 기억하지 않아도됩니까?

그렇습니다. 더 쉬울 것이지만 시스템 방식은 아닙니다. Systemd는 호출자가 reload서비스에 대해 존재 하는지 알고 싶어합니다 . Systemd는 존재하는 기능에 대한 공통 인터페이스가되기를 원하지만 간격을 메우는 책임은 없습니다.

예를 들어, 꼭두각시는 systemd 중심의 서비스가 더이 없다고 가정 reload하고 죽이고 과정을 다시 시작 기본값을 . Service [] 유형에 재로드가 존재하고 통지시 사용해야 함을 지정하는 방법이 추가 된 경우, 기본 재로드가 있거나없는 서비스를 알아야합니다. Chef와 다른 모든 시스템도 systemd가 해당 계층에서 해결하기를 원하기 때문에 같은 것을 배워야합니다. (MiniRant : 프로세스 시작을위한 시스템은 모든 것을 알고, 모든 마운트를하고, 모든 네임 스페이스를 커스터마이징하는 i-do-everything-at-my-layer 시스템 인 것 같습니다. 이 철학을 새로 고침으로 확장 할 수 있습니다.


1
systemctl reload-or-restart그것을 지원하는 경우 서비스를 다시로드하고, 그렇지 않은 경우 다시 시작됩니다. 꼭두각시가 왜이 가정을하는지 모르겠습니다.
Michael Hampton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.