La risposta di James funziona per una dipendenza da 1 a 1. Da 1 a molti, ovvero per assicurarsi che il servizio A inizi prima dei servizi B, C e D, è necessario adottare un altro approccio. È possibile consultare gli script della portmap corrente come riferimento, ma qui è l'approccio generale: creare uno script wait.
Scenario: si desidera che il servizio A venga eseguito sempre prima di service-b, service-c e service-d.
Soluzione: creare uno script di attesa per il servizio A. Chiamarlo "/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
Ciò significa in parole povere: quando il servizio b, c o d segnala che vogliono iniziare, devono attendere l'avvio fino a quando il servizio-a è in esecuzione. Il lavoro service-a-wait è progettato per essere eseguito fino all'avvio di service-a. Una volta terminato il servizio di attesa, ora i servizi b, c e d sono liberi di continuare ed eseguire.
Questo assicurerà che il servizio-a sia attivo e funzionante prima che una qualsiasi delle sue dipendenze inverse tenti di avviarsi.
Nota: la riga "istanza $ JOB" è importante in questo scenario "start on ... or .. or ..". Altrimenti bloccherai davvero solo per uno qualsiasi degli incendi B, C o D per primi.
(l'istanza merita una spiegazione migliore onestamente. per ora, basta farlo.;)