James'in cevabı 1'e 1 bağımlılık için çalışıyor. 1'den çoğa, yani, A servisinin B, C ve D servislerinden önce başladığından emin olmak için, başka bir yaklaşım izlemeniz gerekir. Referans için mevcut portmap scriptlerine bakabilirsiniz, ancak genel yaklaşım şöyle: bir bekleme betiği oluşturun.
Senaryo: Servis A'nızın daima servis-b, servis-c ve servis-d'den önce çalışmasını istiyorsunuz .
Çözüm: Servis A için bir bekleme betiği oluşturun. "/Etc/init/service-a-wait.conf" olarak adlandırın.
# 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
Düz İngilizce'de bunun anlamı şudur: b, c veya d servisi başlatmak istediklerini bildirdiğinde, servis-a çalışıncaya kadar başlamayı beklemelidirler. Bekleme hizmeti işi, hizmet başlatılıncaya kadar çalışacak şekilde tasarlanmıştır. Bekleme servisinden çıktıktan sonra, b, c ve d servisleri devam etmekte ve koşmakta serbesttir.
Bu, herhangi bir ters bağımlılığı başlatmaya teşebbüs etmeden önce a servisinin çalışır durumda ve çalışır durumda olmasını sağlayacaktır.
Not: "example $ JOB" satırı, bu "başlangıç ... veya .. veya .." senaryosunda önemlidir. Aksi halde, yalnızca önce B, C veya D'den hangisinin ateş ettiğini gerçekten engelleyeceksiniz.
(örnekleme, dürüstçe daha iyi bir açıklama yapılmasını hak eder. Şimdilik, sadece yapın.)