Làm thế nào một cờ dịch vụ systemd đã sẵn sàng, để các dịch vụ khác có thể đợi nó sẵn sàng trước khi chúng bắt đầu?


8

Tôi có một loạt các dịch vụ (chẳng hạn C0, C1... C9) mà chỉ nên bắt đầu sau khi một dịch vụ Sđã hoàn thành khởi tạo của nó và hoàn toàn chạy và sẵn sàng cho các dịch vụ khác. Làm thế nào để tôi sắp xếp điều đó với systemd?

Trong Đặt hàng dịch vụ với kích hoạt đường dẫn và đích trong systemd , người ta cho rằng dịch vụ Scó cơ chế viết ra một số loại tệp cờ. Giả sử ở đây, ngược lại, tôi có toàn quyền kiểm soát chương trình mà dịch vụ Schạy và có thể thêm các cơ chế systemd vào nó nếu cần.

Câu trả lời:


7

Một người không nhất thiết cần điều này.

Nếu các Cdịch vụ cần chờ đợi Sđể sẵn sàng để họ có thể mở kết nối ổ cắm với nó, thì người ta không nhất thiết phải làm điều này cả. Thay vào đó, người ta có thể tận dụng việc mở ổ cắm nghe sớm bởi các nhà quản lý dịch vụ.

Một số hệ thống, bao gồm s6 của Laurent Bercot , bộ công cụ nosh của tôi và systemd, có những cách mà ổ cắm nghe có thể được mở sớm, điều đầu tiên trong việc thiết lập dịch vụ. Tất cả đều liên quan đến một cái gì đó ngoài chương trình dịch vụ mở (các) ổ cắm nghe và chương trình dịch vụ, khi được gọi, nhận (các) ổ cắm nghe dưới dạng mô tả tệp đã mở.

Với systemd, cụ thể, người ta tạo ra một đơn vị ổ cắm xác định ổ cắm nghe. systemd mở đơn vị socket và thiết lập nó để hệ thống con kernel đang lắng nghe các kết nối; và chuyển nó đến dịch vụ thực tế như một bộ mô tả tệp mở khi nói đến việc sinh ra quá trình xử lý (các) kết nối đến ổ cắm. (Nó có thể làm điều này theo hai cách, giống như inetdcó thể, nhưng một cuộc thảo luận về các chi tiết Accept=trueso với Accept=falsecác dịch vụ nằm ngoài phạm vi của câu trả lời này.)

Điểm quan trọng là người ta không nhất thiết phải đặt hàng nhiều hơn thế. Hạt nhân bó các kết nối máy khách trong một hàng đợi cho đến khi chương trình dịch vụ được khởi tạo và sẵn sàng chấp nhận chúng và nói chuyện với khách hàng.

Khi một người làm, các giao thức sẵn sàng là điều.

systemd có một bộ các giao thức sẵn sàng mà nó hiểu, dịch vụ được chỉ định bởi dịch vụ với Type=cài đặt trong đơn vị dịch vụ. Giao thức sẵn sàng đặc biệt quan tâm ở đây là notifygiao thức sẵn sàng. Với nó, systemd được yêu cầu mong đợi các tin nhắn từ dịch vụ và khi dịch vụ sẵn sàng, nó sẽ gửi một thông báo đánh dấu sự sẵn sàng. systemd trì hoãn việc kích hoạt các dịch vụ khác cho đến khi sẵn sàng được gắn cờ.

Sử dụng điều này liên quan đến hai điều:

  • Sửa đổi mã Sđể nó gọi một cái gì đó giống như notify_systemd()chức năng của Pierre-Yves Ritschard hoặc chức năng của Cameron T Norman notify_socket().
  • Thiết lập đơn vị dịch vụ cho dịch vụ với Type=notifyNotifyAccess=main.

Các NotifyAccess=mainhạn chế (đó là mặc định) là vì nhu cầu systemd biết để bỏ qua tin nhắn từ các chương trình tinh nghịch (hoặc chỉ bị lỗi đồng bằng), bởi vì bất kỳ quá trình trên hệ thống có thể gửi tin nhắn cho ổ cắm thông báo systemd của.

Người ta sử dụng mã của Pierre-Yves Ritschard hoặc Cameron T Norman để ưu tiên vì nó không loại trừ khả năng có cơ chế này trên UbuntuBSD, Debian FreeBSD, FreeBSD, TrueOS, OpenBSD, v.v. mà mã được cung cấp bởi các tác giả systemd không loại trừ.

Một cái bẫy cần tránh là systemd-notifychương trình. Nó có một số vấn đề lớn, không ít trong số đó là các tin nhắn được gửi cùng với nó có thể bị vứt bỏ không được xử lý bởi systemd. Vấn đề lớn nhất trong trường hợp này là nó không chạy như là quy trình "chính" của dịch vụ, do đó người ta phải mở các thông báo sẵn sàng cho dịch vụ Scho mọi quy trình trên hệ thống NotifyAccess=all.

Một cái bẫy khác cần tránh là nghĩ rằng forkinggiao thức đơn giản hơn. Không phải vậy. Làm điều đó một cách chính xác liên quan đến việc không giả mạo và thoát khỏi cha mẹ cho đến khi (vì một điều) tất cả các luồng công nhân của chương trình đang chạy. Điều này không phù hợp với cách mà phần lớn các mons ngã ba thực sự rẽ nhánh.

đọc thêm


1
Theo con người systemd.service(5), NotifyAccess=allsẽ chấp nhận tin nhắn từ tất cả các thành viên trong nhóm kiểm soát của dịch vụ , điều này không ngụ ý bất kỳ quy trình lừa đảo nào trên hệ thống. Điều này là đủ an toàn cho hầu hết các trường hợp sử dụng. Ngoài ra, mối quan tâm của bạn về tính di động đối với các hệ điều hành khác không liên quan đến OP, vì chúng tôi đã có chủ đề về Systemd ở đây.
Amir

1

Tham khảo trang hướng dẫn systemd.service(5), cụ thể là phần về Loại = , mỗi loại dịch vụ có một cách khác nhau để Systemd xác định rằng nó đã sẵn sàng cung cấp chức năng cho các dịch vụ khác:

  • Nếu Type=simple, các kênh liên lạc của nó phải được cài đặt trước khi daemon được khởi động (ví dụ: các socket được thiết lập bởi systemd, thông qua kích hoạt socket).

  • Nếu Type=forking, quá trình cha mẹ dự kiến ​​sẽ thoát khi khởi động hoàn tất và tất cả các kênh liên lạc được thiết lập.

  • Nếu Type=dbus, dự kiến ​​rằng daemon có được một tên trên xe buýt D-Bus, tại thời điểm đó systemd sẽ tiến hành bắt đầu các đơn vị theo dõi.

  • Nếu Type=notify, dự kiến ​​daemon sẽ gửi một tin nhắn thông báo qua sd_notify(3)hoặc một cuộc gọi tương đương khi nó kết thúc bắt đầu. systemd sẽ tiến hành bắt đầu các đơn vị theo dõi sau khi tin nhắn thông báo này được gửi.

Đối với tùy chọn cuối cùng (gửi tin nhắn qua sd_notify), bạn có thể sử dụng systemd-notifytiện ích và nhớ cấp cho nó quyền truy cập NotifyAccess=all.

Cho rằng bạn có quyền kiểm soát dịch vụ S, bạn có thể tự do lựa chọn tùy chọn tốt nhất cho trường hợp sử dụng của mình hoặc đơn giản là tùy chọn dễ thực hiện nhất.


1

như thế này:

Dịch vụ

[Unit]
Description=My main Service

[Service]
Type=notify
ExecStart=/usr/bin/myBinary

Dịch vụ C0

[Unit]
Description=Dependent service number 0
PartOf=S.service

Dịch vụ C1

[Unit]
Description=Dependent service number 1
PartOf=S.service

Dịch vụ C9.

[Unit]
Description=Dependent service number 9
PartOf=S.service

Trong đó / usr / bin / myBinary thực hiện một cuộc gọi sd_notify READY = 1 khi quá trình khởi tạo hoàn tất.

Tùy thuộc vào cách bạn muốn người phụ thuộc cư xử, bạn có thể sử dụng PartOf, Yêu cầu hoặc BindsTo hoặc những người khác .

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.