Câu trả lời:
Như heemayl đã lưu ý trong bình luận, trang nam trả lời câu hỏi của bạn. Từ trang web:
Muốn =
Một phiên bản yếu hơn của Yêu cầu =. Các đơn vị được liệt kê trong tùy chọn này sẽ được bắt đầu nếu đơn vị cấu hình là. Tuy nhiên, nếu các đơn vị được liệt kê không bắt đầu hoặc không thể thêm vào giao dịch, điều này không ảnh hưởng đến tính hợp lệ của toàn bộ giao dịch. Đây là cách được đề xuất để nối phần khởi động của một đơn vị với phần khởi động của đơn vị khác.
Và yêu cầu =:
Định cấu hình phụ thuộc yêu cầu vào các đơn vị khác. Nếu đơn vị này được kích hoạt, các đơn vị được liệt kê ở đây cũng sẽ được kích hoạt. Nếu một trong các đơn vị khác bị vô hiệu hóa hoặc kích hoạt không thành công, đơn vị này sẽ bị hủy kích hoạt. Tùy chọn này có thể được chỉ định nhiều lần hoặc nhiều đơn vị phân tách không gian có thể được chỉ định trong một tùy chọn trong đó trường hợp phụ thuộc yêu cầu cho tất cả các tên được liệt kê sẽ được tạo. Lưu ý rằng các phụ thuộc yêu cầu không ảnh hưởng đến thứ tự dịch vụ được bắt đầu hoặc dừng. Điều này phải được cấu hình độc lập với các tùy chọn After = hoặc Before =. Nếu một đơn vị foo.service yêu cầu một đơn vị bar.service như được định cấu hình với Yêu cầu = và không có thứ tự nào được định cấu hình với After = hoặc Before =, thì cả hai đơn vị sẽ được khởi động đồng thời và không có bất kỳ độ trễ nào giữa chúng nếu foo.service được kích hoạt. Thường
Lưu ý rằng loại phụ thuộc này không có nghĩa là đơn vị khác luôn phải ở trạng thái hoạt động khi thiết bị này đang chạy. Cụ thể: không kiểm tra điều kiện (chẳng hạn như conditionPathExists =, conditionPathExists =, Tiết - xem bên dưới) không làm cho công việc bắt đầu của một đơn vị có Yêu cầu = phụ thuộc vào đơn vị đó không thành công. Ngoài ra, một số loại đơn vị có thể tự hủy kích hoạt (ví dụ: quy trình dịch vụ có thể quyết định thoát ra một cách sạch sẽ hoặc người dùng có thể rút phích cắm thiết bị), không được truyền đến các đơn vị có Yêu cầu = phụ thuộc. Sử dụng loại phụ thuộc BindsTo = cùng với After = để đảm bảo rằng một đơn vị có thể không bao giờ ở trạng thái hoạt động mà không có đơn vị cụ thể khác cũng ở trạng thái hoạt động (xem bên dưới).
Dịch vụ của bạn sẽ chỉ bắt đầu nếu đã đạt được multi-user.target (Tôi không biết điều gì xảy ra nếu bạn cố thêm nó vào mục tiêu đó?) Và systemd sẽ cố gắng khởi động dịch vụ display-manager.service trước dịch vụ của bạn . Nếu display-manager.service không thành công vì bất kỳ lý do gì, dịch vụ của bạn vẫn sẽ được khởi động (vì vậy nếu bạn thực sự cần trình quản lý hiển thị, hãy sử dụng Requires=
cho điều đó). Nếu multi-user.target không đạt được tuy nhiên, dịch vụ của bạn sẽ không được đưa ra.
Dịch vụ của bạn là gì? Có phải là một hệ thống kiosk? Theo trực giác, tôi cho rằng bạn muốn thêm dịch vụ của mình vào multi-user.target (để dịch vụ này được khởi chạy khi khởi động) và có phụ thuộc hoàn toàn vào dịch vụ display-manager.service thông qua Requires=display-manager.service
. Nhưng đó chỉ là phỏng đoán hoang dã.
Việc triển khai máy chủ của chúng tôi sử dụng LDAP chứa tất cả ID người dùng và bản đồ tự động. Thư mục nhà của người dùng được gắn NFS và người dùng thường tạo các cronjob @reboot với mã thực thi trong thư mục chính của họ. Chúng tôi cũng sử dụng sssd cho bộ nhớ cache. Không cần phải nói, chúng tôi có một sự phụ thuộc cao vào việc có thể cung cấp một thứ tự khởi động xác định để cấu hình này hoạt động. Chúng tôi đã phát triển một cấu hình systemd rất ngắn gọn và đã phát hiện ra một sắc thái tối nghĩa giữa các tùy chọn phần "muốn" và "yêu cầu".
Nếu bạn gặp lỗi dịch vụ trong khi khởi động và có một dịch vụ khác phụ thuộc vào "yêu cầu" trên dịch vụ đó với "restart = always" được đặt làm tùy chọn dịch vụ, dịch vụ phụ thuộc đó sẽ không khởi động lại. Tuy nhiên, nếu bạn có "muốn" làm tùy chọn, dịch vụ phụ thuộc sẽ khởi động lại, như mong đợi.
man systemd.unit