하나의 Upstart 작업이 다른 Upstart 작업보다 먼저 시작되도록하려면 어떻게해야합니까?


33

이것은 일반적인 Upstart 질문이지만 특정 사례를 사용하겠습니다.

Centrify는 NIS에서 ActiveDirectory 게이트웨이입니다. 제공하는 인증 서비스에 의존하는 서비스 (예 : autofs, cron, nis 등)를로드해야합니다.

이것은 다른 서비스의 종속성을 변경하려고 할 때도 달성하기가 매우 어려운 것으로 판명되었습니다 (어쨌든하지 말아야한다고 생각하지 않지만 가능한 경우 다른 Upstart 작업을 건드리고 싶지 않습니다) .

제안?

답변:


29

해결책은 다른 방향에서 문제에 접근하는 것입니다. Centrify의 시작 기준을 충족시키기 위해 기존 서비스를 새로운 Centrify 서비스에 의존하게 만들 필요는 없지만 새로운 Centrify 서비스를 기존 서비스에 의존하게 만들 필요는 없습니다.

예를 들어 Upstart 구성 파일 /etc/init/centrify.conf은 다음과 같습니다.

시작 (cron 시작 또는 autofs 시작 또는 nis 시작)

이것을 영어로 변환하면 다음과 같이 번역됩니다.

cron, autofs 또는 nis start (둘 중 먼저 시작하는) 직전에 Centrify 서비스를 시작하십시오 .

cron, autofs 또는 nis 시작 순서는 관련이 없습니다. Upstart는 어떤 서비스가 먼저 시작되기 전에 Centrify가 시작되도록하여 서비스가 시작되기 전에 Centrify가 실행되도록합니다.

Upstart는 Centrify가 실행되기 시작할 때까지 시작하려는 첫 번째 서비스의 시작을 차단합니다.

이런 식으로 생각하는 데 익숙해지면 매우 우아하고 단순합니다.


4
이것은 나에게 완전히 거꾸로 보인다. 다른 것들에 의존 할 때 왜 하나 개의 서비스에 대한 conf의 스크립트를 수정해야합니다 그것 ?
ben w

3
@benw 소유하지 않은 기존 서비스 설정을 수정할 필요가 없습니다.
Paccc

1
@Paccc nginx에 의존하는 새로운 스크립트를 작성할 때, 나는 소유하지 않은 nginx에 대한 conf 스크립트를 수정해야합니다 ...
ben w

2
@benw 왜 start on (started nginx)새 스크립트에서 사용할 수 없습니까?
Paccc

2
@Paccc은 실제로는 아닙니다. start on (started nginx)"nginx 후에 서비스 시작"을 의미합니다. "필요하기 때문에 nginx를 시작하기 전에 시작"과 동일하지 않습니다.
sickill 2009 년

12

James의 답변은 1 대 1 의존성에 효과적입니다. 1 대 다수, 즉 서비스 A가 서비스 B, C 및 D보다 먼저 시작되도록하려면 다른 접근 방법을 사용해야합니다. 현재 포트 맵 스크립트를 참조 할 수 있지만 다음은 일반적인 접근 방식입니다. 대기 스크립트 작성.

시나리오 : 서비스 A가 항상 서비스 b, 서비스 c 및 서비스 d보다 먼저 실행 되기를 원합니다 .

해결 방법 : 서비스 A에 대한 대기 스크립트를 작성하십시오. "/etc/init/service-a-wait.conf"

# service-a-wait

start on (starting service-b 
    or starting service-c
    or starting service-d)
stop on (started service-a or stopped service-a)

# We know that we have more than one job that needs to wait for service-a and
# will make use of this service, so we need to instantiate.
instance $JOB

# Needed to make starting the job successful despite being killed
normal exit 2
task

script

    status service-a | grep -q "start/running" && exit 0
    start service-a || true

    # Waiting forever is ok.. upstart will kill this job when
    # the service-a we tried to start above either starts or stops
    while sleep 3600 ; do :; done

end script

이것이 일반 영어로 의미하는 것은 : 서비스 b, c 또는 d가 시작하려는 신호를 보낼 때 서비스 -a가 실행될 때까지 시작을 기다려야합니다. 서비스 대기 작업은 서비스가 시작될 때까지 실행되도록 설계되었습니다. service-a-wait가 종료되면 이제 서비스 b, c 및 d를 자유롭게 수행하고 실행할 수 있습니다.

이렇게하면 역방향 종속성이 시작되기 전에 서비스 a가 시작되어 실행됩니다.

참고 : "instance $ JOB"줄은이 "start on ... or .. or .."시나리오에서 중요합니다. 그렇지 않으면 B, C 또는 D 중 어느 것이 먼저 발사되는지 실제로 차단합니다.

(인스턴트 화는 솔직히 더 나은 설명을 할 가치가 있습니다. 지금은 그렇게하십시오.;)


3
나는 이것을 얻지 못한다. .. 서비스 A 시작과 서비스 B 시작 사이의 경쟁 조건을 계속 막는 것은 무엇인가? 내가 스크립트가 완료되었음을 신출내기 알 수 표시되지 않습니다 (... 어쩌면 갑자기 출세의 겉만 번지르르 한 문서에이 비난) ... "서비스가-A 시작"
크리스 Pacejo

@ 마크 러셀 : 그 normal exit 2라인이 normal exit 0 2대신 되어야 합니까? script섹션 의 첫 번째 줄은 매우 명확하게 할 수 있습니다 exit 0.
20:45에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.