Câu trả lời của James hoạt động cho sự phụ thuộc 1-1. Đối với 1 đến nhiều, tức là, để đảm bảo dịch vụ A bắt đầu trước các dịch vụ B, C và D, bạn cần thực hiện một cách tiếp cận khác. Bạn có thể xem các tập lệnh portmap hiện tại để tham khảo nhưng đây là cách tiếp cận chung: tạo tập lệnh chờ.
Kịch bản: bạn muốn Dịch vụ A của bạn luôn chạy trước dịch vụ-b, dịch vụ-c và dịch vụ-d.
Giải pháp: tạo tập lệnh chờ cho Dịch vụ A. Gọi nó là "/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
Điều này có nghĩa trong tiếng Anh đơn giản là: khi dịch vụ b, c hoặc d báo hiệu rằng họ muốn bắt đầu, họ phải đợi để bắt đầu cho đến khi dịch vụ-a chạy. Công việc chờ đợi dịch vụ được thiết kế để chạy cho đến khi dịch vụ-a bắt đầu. Khi đã thoát khỏi dịch vụ, giờ các dịch vụ b, c và d được tự do thực hiện và chạy.
Điều này sẽ đảm bảo dịch vụ-a hoạt động và chạy trước khi bất kỳ sự phụ thuộc ngược nào của nó cố gắng bắt đầu.
Lưu ý: dòng "dụ $ JOB" rất quan trọng trong kịch bản "bắt đầu ... hoặc .. hoặc .." này. Nếu không, bạn sẽ chỉ thực sự chặn bất kỳ B, C hoặc D nào bắn ra trước.
(khởi tạo xứng đáng một lời giải thích tốt hơn một cách trung thực. bây giờ, chỉ cần làm điều đó .;)