Một người không nhất thiết cần điều này.
Nếu các C
dị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ư inetd
có thể, nhưng một cuộc thảo luận về các chi tiết Accept=true
so với Accept=false
cá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à notify
giao 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=notify
và NotifyAccess=main
.
Các NotifyAccess=main
hạ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-notify
chươ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ụ S
cho 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 forking
giao 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
systemd.service(5)
,NotifyAccess=all
sẽ 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.