실행이 보장되는 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-files
그 normal exit
선은 무한한 수면 중에 살해될 가능성을 설명합니다. task
중지된 상태에 도달할 때까지 jobA와 jobB를 차단하는 라인이 필요합니다 . modify-files
아직 시작되지 않은 경우 먼저 실행되는 인스턴스가 시작됩니다 .
중지된 상태에 도달하지 않으므로 modify-files
jobA 또는 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
시작하여 다음 날짜에 중지 됩니다.myEvent
mainJob
runlevel [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를 사용하면 작업이 두 번 실행되므로(예: 작업이 다시 시작되는 경우) 생략하겠습니다.