시스템 단위 파일이 있고 다음과 같은 매개변수를 제공하여 실패 시 다시 시작할 수 있다는 것을 알고 있습니다.
Restart=always
RestartSec=90
실패할 때마다 90초 후에 다시 시작됩니다.
하지만 시스템 시간이 특정 시간 범위(예: 08:00~17:00) 사이에 있을 때만 재부팅하고 재부팅만 하고 싶습니다.
systemd를 통해 이를 수행할 수 있는 방법이 있습니까?
답변1
서비스 단위 파일에 직접 설정: 아니요.
Heath Robinson 메커니즘 사용: 예, 아래입니다.
- 어딘가에 두 개의 클립 파일을 만들고
wibble-in-hours.conf
이 설정을 켜고wibble-out-of-hours.conf
이 설정을 끄십시오. 장 제목을 잊지 마세요. - 어느 시점에서나
/etc/systemd/system/wibble.service.d/restart.conf
이는 이러한 파일 중 하나입니다. systemd 매뉴얼(qv)에서는 내장된 디렉토리와 조각 파일을 설명합니다. - uschedule 작업, cron 작업 또는 조각 파일 교환을 원하는 기타 메커니즘을 설정하고, 적절한 시간에 호출하고,
systemctl daemon-reload
업무 시간 외 시간에 서비스가 종료되면 서비스를 시작합니다. (서비스 차단, 비활성화 및 일부 운영 체제가 패키지 업그레이드 중에 서비스를 일시적으로 중지한다는 사실에 유의하십시오. 이 모든 것이 서비스 시작 여부를 테스트하는 것이 중요합니다.)
답변2
재시작 간격이 아니라는 점을 받아들일 수 있는 경우정확히90초이고 매번 똑같지는 않습니다. 그러면 서비스 장치 + 해당 타이머 장치를 사용하여 간단한 방법으로 이를 달성할 수 있습니다.
타이머 장치가 시간 범위를 지정하도록 하세요.OnCalendar=
환경.
예를 들어, 08:00부터 16:59까지 1분마다 실행하려면(보통 00초에 실행되지만 시스템에 5초의 여유 시간을 주어 예약):
[Timer]
OnCalendar=*-*-* 08-16:*:00
AccuracySec=5s
또한 서비스 단위에 포함하십시오 Restart=no
(또는 기본값 Restart=
이므로 생략).no
이 구성을 사용하면 systemd가 해당 시간 범위 내에서 매분마다 장치를 시작하려고 시도합니다. 그러나 장치가 이미 실행 중인 경우 시작하려고 해도 아무 작업도 수행되지 않습니다.
반면에 장치가 중지되고 타이머가 시작되면(해당 시간 동안 1분에 한 번씩) 장치는 실제로 "다시 시작"됩니다.
순 효과는 타이머가 중지 후 0초에서 65초 사이에 장치를 다시 시작하도록 한다는 것입니다(마진 5초 계산). 그러나 해당 시간 범위 내에서만 가능합니다(타이머는 해당 시간 동안에만 작동하므로).
0을 하한값으로 사용하는 것이 허용되지 않는 경우(장치가 중지된 후 다시 시작되는 사이에 최소 30초가 필요하다고 가정) ExecStopPost=/bin/sleep 30
서비스 단위에 추가하여 해결 방법을 사용할 수 있습니다. 이렇게 하면 기본 서비스가 중지된 후에도 장치가 효과적으로 "중지"되는 데 30초가 필요하므로 해당 30초가 경과한 후에만 타이머 장치에서 다시 시작할 수 있습니다. 사실상 이로 인해 중지 후 30~95초 내에 다시 시작됩니다.
바라보다systemd.time의 매뉴얼 페이지OnCalendar=
다시 시작 정책의 특정 시간 요구 사항에 맞게 간격을 조정할 수 있도록 간격을 지정하는 방법에 대한 자세한 내용입니다 .
답변3
귀하의 조언과 시간을 내주셔서 감사합니다. 나는 systemd 서비스를 통해 이것을 달성했습니다.
Restart=always
@JdeBP가 제안한 두 개의 crontab 항목
- 08:00에 시작
- 다른 사람들은 17:00에 멈춥니다.