James 'Antwort funktioniert für eine 1: 1-Abhängigkeit. Für eine 1 bis viele, dh um sicherzustellen, dass Dienst A vor den Diensten B, C und D startet, müssen Sie einen anderen Ansatz wählen. Sie können sich die aktuellen Portmap-Skripte als Referenz ansehen, aber hier ist der allgemeine Ansatz: Erstellen Sie ein Warteskript.
Szenario: Sie möchten, dass Service A immer vor Service-B, Service-C und Service-D ausgeführt wird.
Lösung: Erstellen Sie ein Warteskript für Service A. Rufen Sie es "/etc/init/service-a-wait.conf" auf.
# 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
Dies bedeutet im Klartext: Wenn Service b, c oder d signalisiert, dass sie gestartet werden möchten, müssen sie warten, bis Service-a ausgeführt wird. Der Service-a-Wait-Job wird ausgeführt, bis Service-a gestartet wurde. Sobald service-a-wait beendet ist, können die Dienste b, c und d weiter ausgeführt werden.
Dies stellt sicher, dass service-a aktiv ist, bevor eine der umgekehrten Abhängigkeiten gestartet wird.
Hinweis: Die Zeile "instance $ JOB" ist in diesem Szenario "start on ... or .. or .." wichtig. Andernfalls blocken Sie nur für das, was zuerst von B, C oder D ausgelöst wird.
(Die Instanziierung verdient eine ehrlichere Erklärung. Tu es vorerst einfach.;)