Bắt đầu dịch vụ systemd sau khi dịch vụ cụ thể? [đóng cửa]


81

Tôi có một câu hỏi chung. Làm cách nào để khởi động một đơn vị systemd *.servicesau khi một đơn vị cụ thể *.serviceđã khởi động thành công?

Câu hỏi cụ thể hơn là, làm thế nào để tôi website.servicechỉ bắt đầu sau khi mongodb.serviceđã bắt đầu? Nói cách khác website.servicenên phụ thuộc vào mongodb.service.


1
Câu hỏi này thuộc về ServerFault, không?
Rémi

1
@ Rémi không sao cả trên cả hai trang web! :)
Chim cánh cụt ẩn danh

2
@AnonymousPenguin Không, giống như 3,5 năm trước khi bạn trả lời, đó không phải là một câu hỏi chủ đề cho SO. Nó không phải về lập trình. SF hoặc tốt hơn là Unix / Linux.SE sẽ thích hợp hơn nhiều.
underscore_d

Stack Overflow là một trang dành cho các câu hỏi về lập trình và phát triển. Câu hỏi này có vẻ lạc đề vì nó không phải về lập trình hay phát triển. Xem những chủ đề tôi có thể hỏi tại đây trong Trung tâm trợ giúp. Có lẽ Super User hoặc Unix & Linux Stack Exchange sẽ là nơi tốt hơn để hỏi.
jww

Câu trả lời:


113

Trong tệp .service dưới phần [Đơn vị]:

[Unit]
Description=My Website
After=syslog.target network.target mongodb.service

Phần quan trọng là mongodb.service

Trang mô tả nó tuy nhiên do định dạng nên nó không rõ ràng ngay từ cái nhìn đầu tiên

systemd.unit - được định dạng tốt

systemd.unit - không được định dạng tốt


1
Dịch vụ mongod của chúng tôi bắt đầu một cơ sở dữ liệu rất lớn. Dịch vụ tiếp theo không bắt đầu chính xác vì có vẻ như mongo mất nhiều thời gian hơn để tải cơ sở dữ liệu sau khi bắt đầu. Vì vậy, dịch vụ thứ 2 của chúng tôi khởi động nhưng không thành công vì mongo đã khởi động thành công nhưng chưa tải cơ sở dữ liệu. Có lẽ một sự chậm trễ có thể giúp ...
wayofthefuture

Dịch vụ systemd có thể xử lý tình huống sau không. Xem xét nhiều dịch vụ A, B, C, D. Nếu A tồn tại Tôi muốn B, C, D chỉ bắt đầu sau A Còn nếu A không tồn tại B, C, D có thể bắt đầu theo bất kỳ thứ tự nào. Vui lòng giúp đỡ
achilles

@achilles Bạn có thể tạo một dịch vụ giả mạo A trên các hệ thống mà A không cần thiết không. Bằng cách đó, các phụ thuộc của B, C, D có thể được giữ đơn giản.
Walter A

49

After=sự phụ thuộc chỉ có hiệu quả khi dịch vụ bao gồm After=và dịch vụ được bao gồm bởi After=cả hai đều được lên lịch khởi động như một phần của quá trình khởi động của bạn.

Ví dụ:

a.service
[Unit]
After=b.service

Bằng cách này, nếu cả hai a.serviceb.serviceđược kích hoạt , thì systemd sẽ đặt hàng b.servicesau a.service.

Nếu tôi không hiểu lầm, những gì bạn đang hỏi là làm thế nào để bắt đầu b.servicekhi a.servicebắt đầu mặc dù b.servicekhông được bật.

Chỉ thị cho điều này là Wants=hoặc Requires=dưới [Unit].

website.service
[Unit]
Wants=mongodb.service
After=mongodb.service

Sự khác biệt giữa Wants=Requires=với Requires=, không khởi động được b.servicesẽ khiến khởi động của a.servicekhông thành công, trong khi với Wants=, a.servicesẽ bắt đầu ngay cả khi b.servicekhông thành công. Điều này được giải thích chi tiết trên trang người đàn ông của.unit .


8
Tôi tin rằng sự thật hoàn toàn trái ngược với câu trả lời này. After=website.servicecó nghĩa là "thực thi đơn vị của tôi sau website.service!". Đó là những gì được giải thích trong tài liệu: "After = đảm bảo rằng đơn vị đã cấu hình được khởi động sau khi đơn vị được liệt kê khởi động xong" . Tôi giả sử "các đơn vị được liệt kê" là các đơn vị ở bên phải của "Sau =".
Sindarus

"Bằng cách này, nếu cả a.service và b.service đều được bật, thì systemd sẽ đặt hàng b.service sau a.service." Ý bạn không phải là ngược lại sao? swap(a, b)
Mateen Ulhaq
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.