Làm cách nào tôi có thể đảm bảo một công việc Upstart bắt đầu trước các công việc Upstart khác?


33

Đây là một câu hỏi khởi đầu chung, nhưng hãy để tôi sử dụng một trường hợp cụ thể:

Centrify là một cổng NIS đến ActiveDirectory. Nó cần tải trước bất kỳ dịch vụ nào sẽ phụ thuộc vào dịch vụ xác thực mà nó cung cấp, ví dụ: autofs, cron, nis, et al.

Điều này đã được chứng minh là khá khó khăn để đạt được, ngay cả khi cố gắng thay đổi sự phụ thuộc của các dịch vụ khác (điều mà tôi không nghĩ là chúng ta nên làm bằng mọi cách, tôi không muốn chạm vào các công việc Upstart khác nếu có thể) .

Gợi ý?

Câu trả lời:


29

Giải pháp là tiếp cận vấn đề theo hướng khác: để đáp ứng các tiêu chí bắt đầu cho Ly tâm, không cần thiết phải thực hiện các dịch vụ hiện tại phụ thuộc vào dịch vụ Ly tâm mới, thay vì dịch vụ Ly tâm mới phụ thuộc vào các dịch vụ hiện có.

Ví dụ: tệp cấu hình Upstart /etc/init/centrify.confcó thể nói:

bắt đầu (bắt đầu cron hoặc bắt đầu tự động hoặc bắt đầu nis)

Chuyển đổi nó sang tiếng Anh, điều này sẽ dịch là:

bắt đầu dịch vụ Ly tâm ngay trước khi cron, autofs hoặc nis bắt đầu (tùy theo điều kiện nào bắt đầu trước).

Thứ tự khởi động cron, autofs hoặc nis là không liên quan: Upstart sẽ đảm bảo rằng Centrify sẽ bắt đầu trước khi bất kỳ dịch vụ nào bắt đầu trước, do đó đảm bảo rằng Ly tâm chạy trước khi bất kỳ một trong các dịch vụ đó bắt đầu.

Cũng lưu ý rằng Upstart sẽ chặn bắt đầu dịch vụ đầu tiên muốn bắt đầu cho đến khi Centrify bắt đầu chạy.

Rất thanh lịch và đơn giản một khi bạn đã quen với suy nghĩ theo cách này.


4
điều này dường như hoàn toàn ngược với tôi. Tại sao tập lệnh conf cho một dịch vụ phải được sửa đổi khi những thứ khác phụ thuộc vào ?
ben w

3
@benw Vì vậy, bạn không phải sửa đổi cài đặt dịch vụ hiện có mà bạn không sở hữu.
Paccc

1
@Paccc khi tôi viết một tập lệnh mới phụ thuộc vào nginx, tôi phải sửa đổi tập lệnh conf cho nginx ... mà tôi không sở hữu.
ben w

2
@benw Tại sao bạn không thể sử dụng start on (started nginx)trong tập lệnh mới của mình?
Paccc

2
@Paccc không thật. start on (started nginx)có nghĩa là "bắt đầu dịch vụ của tôi sau nginx". Điều này không giống như "bắt đầu nginx trước dịch vụ của tôi vì nó cần nó".
ốm

12

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 đó .;)


3
Tôi không nhận được điều này, điều gì ngăn cản tình trạng chạy đua giữa bắt đầu dịch vụ A và dịch vụ B tiếp tục bắt đầu? Tôi không biết làm thế nào mới bắt đầu sẽ biết rằng kịch bản đã hoàn thành "bắt đầu dịch vụ-a", (đổ lỗi cho tài liệu kém chất lượng của Upstart có thể là
Khăn

@Mark Russell: Không nên thay thế normal exit 2dòng normal exit 0 2đó? Dòng đầu tiên trong scriptphần khá rõ ràng có thể exit 0.
đóng băng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.