다른 두 작업이 시작되기 전에 완료가 보장되는 단일 실행 Upstart 작업을 어떻게 생성합니까?

다른 두 작업이 시작되기 전에 완료가 보장되는 단일 실행 Upstart 작업을 어떻게 생성합니까?

실행이 보장되는 Upstart 작업을 어떻게 작성합니까?한 번만각 시작 이후에 실행되지만 최소한 두 개의 다른 작업 중 하나가 실행되기 전에 완료되도록 보장됩니다. 다른 두 작업에 대한 Upstart init 파일은 나에게 속하지 않으므로 변경하고 싶지 않습니다. 다른 두 작업 중 하나를 다시 시작해도 원하는 작업이 다시 실행되어서는 안 됩니다.

상황은 원하는 작업이 다른 작업 모두에 필요한 로컬 파일 시스템의 일부 파일을 일부 수정해야 한다는 것입니다.

저는 Upstart를 처음 접했고 예상했던 것보다 학습 곡선이 더 가파르다는 것을 알았습니다.솔루션의 효과는 솔루션 자체만큼 가치가 있습니다.

답변1

나는 내 자신의 질문에 대한 답을 가지고 있다고 믿습니다.CameronNemo의 부분 솔루션그리고마크 러셀의 답변관련이 있지만 다소 다른 질문입니다.

두 개의 Upstart 구성 파일이 필요합니다. 첫 번째는 로컬 파일 시스템을 사용할 수 있게 되자마자 시작되어 사전 시작 스크립트로 원하는 파일 수정을 수행한 다음 영원히 실행 상태로 유휴 상태로 유지되는 작업입니다.

# modify-files - Single-execution file modification job

start on local-filesystems

console log

pre-start script
  echo "$(date --rfc-3339=ns) $(hostname) $UPSTART_JOB"
  exec /path/to/your/script
end script

두 번째 구성 파일은 수정하려는 파일에 따라 달라질 수 있는 다른 모든 작업의 ​​시작을 지연시키는 Upstart 작업입니다. 종속 작업당 하나의 인스턴스를 생성합니다.

# modify-files-wait - Helper task for modify-files

start on (starting jobA or jobB)
stop on (started modify-files or stopped modify-files)

instance $JOB

console log
normal exit 0 2
task

script
  echo "$(date --rfc-3339=ns) $(hostname) $UPSTART_JOB ($UPSTART_INSTANCE)"
  status modify-files | grep -q "start/running" && exit 0
  start modify-files || true
  sleep infinity
end script

Upstart는 실행 상태에서 유휴 상태 modify-files-wait인 모든 인스턴스를 종료합니다 . modify-filesnormal exit선은 무한한 수면 중에 살해될 가능성을 설명합니다. task중지된 상태에 도달할 때까지 jobA와 jobB를 차단하는 라인이 필요합니다 . modify-files아직 시작되지 않은 경우 먼저 실행되는 인스턴스가 시작됩니다 .

중지된 상태에 도달하지 않으므로 modify-filesjobA 또는 jobB가 다시 시작되더라도 새로 실행되지 않습니다.

이 솔루션은 효과가 있는 것 같지만 어떤 비판이나 개선이라도 환영합니다.

답변2

선택한 이벤트에서 시작하는 간단한 작업 작업을 정의하고, 스크립트를 실행하고, 마지막에 이벤트를 내보내 다른 두 작업을 시작할 수 있습니다.

예를 들어:

# mainJob - 
#
# This service emit myEvent to run firstJob 
description "emit myEvent to run firstJob"
start on runlevel [2345]
task
console log
script
     echo "(startTask) $UPSTART_JOB -- $UPSTART_EVENTS" 
     exec /path/to/your/script
     initctl emit -n myEvent
end script

다른 두 작업의 시작 스크립트를 수정하지 않으려면 다음을 수행해야 합니다.파일 재정의시작 및 중지 조건을 수정하여 작업이 시작되고 중지되는 방식을 수정할 수 있습니다.

내 예에 따라 다음과 같은 간단한 것을 만들었습니다 firstJob.conf.

# firstJob - 
#
# This service print environment variable 
description "print environment variable"
start on runlevel [2345]
stop on runlevel [016]
task
console log
script
if [ "$RUNLEVEL" = "0" -o "$RUNLEVEL" = "1" -o "$RUNLEVEL" = "6" ]; then
     exec  echo "(stopTask) $UPSTART_JOB -- $UPSTART_EVENTS"  
else
     exec  echo "(startTask) $UPSTART_JOB -- $UPSTART_EVENTS" 
fi
end script

그런 다음 재정의 파일을 만드는 조건에서 시작을 재정의합니다.

echo "start on myEvent" > /etc/init/firstJob.override

따라서 생성된 날짜부터 firstJob시작하여 다음 날짜에 중지 됩니다.myEventmainJobrunlevel [016]

나는 lubuntu 12.04에서 이러한 작업을 테스트했으며 재부팅 후 다음에서 발견했습니다 /var/log/upstart/firstJob.log.

  (startTask) firstJob -- myEvent

mainJob"다른 두 작업"이 시작하려면 특정 이벤트 조건이 필요한지 확인하고 이러한 이벤트에서 시작되는지 확인해야 합니다 .

답변3

start on starting jobA or starting jobB

instance $JOB

pre-start exec /path/to/script

시작 비트는 이 작업이 완료될 때까지 작업이 수명 주기에서 계속 진행되는 것을 방지합니다.

인스턴스 비트는 인스턴스 스탠자가 없는 경우처럼 하나의 시작 이벤트(jobA 및 jobB에 대한)가 모두 금지되도록 하기 위한 것입니다.

일반 exec/script 대신 사전 시작 exec/script를 사용하면 스크립트/실행된 명령이 완료될 때 작업이 계속 실행 중인 것으로 간주되는 반면, 기존 exec/script를 사용하면 작업이 실행 중인 것으로 간주됩니다. exec/script가 종료되면 중지됩니다.

task를 사용하면 작업이 두 번 실행되므로(예: 작업이 다시 시작되는 경우) 생략하겠습니다.

관련 정보