Systemd : "oneshot"서비스가 처음 실패 할 경우 재 시도하는 방법은 무엇입니까?


18

systemd 서비스 맨 페이지를 몇 번 읽었지만 여전히 기본적인 시스템 패턴을 알 수는 없습니다.

부팅시 시작 프로세스를 한 번 (도커 컨테이너 또는 드라이브 포맷과 같은) 실행하여 성공적으로 완료하고 싶습니다. 그러나 Type = oneshot을 사용하면 Restart = on-failure를 사용할 수 없으며 실패하면 작업을 다시 시도하지 않습니다. 여기에 명백한 것이 빠져 있습니까?

또한 Restart = on-failure로 Type = simple 설정을 시도했지만 많은 경우 oneshot 서비스가 제공하는 다음 동작 (맨 페이지에서)이 필요합니다.

oneshot의 동작은 단순과 유사합니다. 그러나 systemd가 후속 장치를 시작하기 전에 프로세스를 종료해야합니다.

업데이트 :


내가 사용한 한 가지 해결 방법은 합리적인 값 과 함께 다음과 같이 생략 Restart하고 래핑하는 my_cmd것 입니다. ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'TimeoutStartSec
rozcietrzewiacz

FailureAction =보셨습니까 ? Restart=설정 FailureAction=[self.unit]([self.unit]을 장치 이름으로 대체) 과 동일한 것을 달성 할 수 있습니다 . 그것은 해 키지 만 적어도 명시적이고 쉽게 따라 할 수 있습니다.
Centimane

@Centimane은와 FailureAction같은 값을 StartLimitAction가지며 모든 것을 제외하고 none는 일종의 종료를 트리거합니다.
jpkotta 2011

답변:


5

내가 시도하고있는 가능한 해결 방법은

  [Unit]
    Description=Tags instance and EBS vols
    After=docker.service
    Requires=docker.service

    [Service]
    ExecStartPre=/usr/bin/docker run --rm -v /opt/tag.sh:/tag.sh -v /opt:/ack --entrypoint=/bin/sh alpine /tag.sh
    ExecStartPre=/usr/bin/sh -c '[[ -e /opt/TAG_SUCCESS ]]'
    ExecStart=/usr/bin/rm /opt/TAG_SUCCESS
    Restart=on-failure
    RestartSec=30

스크립트 tag.shtouch /ack/TAG_SUCCESS실행이 끝나는 곳. 나는 이것이 ExecStartPre순차적으로 실행되어 호출하기 전에 성공적인 완료를 기다리는 동안 ExecStart장치가 Starting한 번만 ExecStart호출되어 시작 작업이 완료 되었다고 확신하는 시점 에서 원하는 동작에 매우 가깝다고 생각합니다 .

그러나 이것은 여전히 ​​거대한 핵처럼 느껴지십니까?


RemainAfterExit=yes다른 장치가 의존 할 수 있도록 장치를 "활성"상태 로 설정해야한다는 점을 제외하고는 잘 작동 했습니다.
Guss
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.