매우 이상한 문제가 있습니다 systemd
. 메시지를 발행하면 systemctl restart
이전 프로세스가 완료되기 전에 새 프로세스가 시작됩니다.
이는 시작 메시지("로그 온") 다음에 최종 종료 메시지("로그 오프")가 기록되는 로그에서 확인할 수 있습니다.
프로세스 중지와 시작 사이에 지연을 추가하는 방법이 있습니까?
답변1
시스템 서비스 파일에서 RestartSec 옵션을 설정하여 재시작 지연을 추가할 수 있습니다. 아래 예를 참조하세요.
[Service]
Restart=always
RestartSec=30
이 링크를 확인하세요더 많은 예시를 알아보세요.
답변2
RestartSec는 systemctl restart 명령을 통해 특정 서비스를 다시 시작할 때만 사용되는 것 같습니다.
예를 들어 A와 B라는 두 가지 서비스가 있습니다.
[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always
그리고
[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30
systemctl restart B를 수행하면 예상대로 작동하지만... systemctl restart A를 수행하면 두 서비스 모두 지연 없이 즉시 중지되었다가 다시 시작됩니다.
Systemd는 분명히 사용자가 지정한 한 서비스의 구성 값만 사용하고 해당 서비스에 대한 종속성을 무시합니다.
이것은 들리는 것만큼 드물지 않습니다. B가 원격 서버와 통신하는 경우 원격 측에서 클라이언트를 거부하므로 빠른 시작 및 중지가 실패할 수 있습니다. 그러나 A가 업데이트되고 B가 변경되지 않는 한 A는 직접 다시 시작됩니다.
A에 지연을 추가하여 이 문제를 해결할 수도 있지만 B가 종속성이 아닐 때 A가 B를 인식하도록 하여 객체 격리를 깨기 때문에 그렇게 할 필요가 없습니다.
답변3
ExecStopPost
서비스가 중지된 후 명령을 실행할 수 있는 를 사용할 수 있습니다 .
ExecStopPost=/bin/sleep 5
그런 다음 서비스가 중지될 때마다(수동 다시 시작 또는 서비스 종료 포함) 5초 동안 기다립니다. 정지 후 5초 이내에는 시작되지 않습니다.