systemd forking vs đơn giản?


24

Tôi đang viết systemdtập tin đơn vị đầu tiên của tôi .

Đối với Type, có một vài lựa chọn: forking, simple, vv Tôi có đọc các tài liệu Redhat về chủ đề này (Bảng 9.9), nhưng vẫn không chắc chắn khi nào tôi nên sử dụng tùy chọn.

Bất kỳ hướng dẫn?

Câu trả lời:


46

Khi bạn khởi động dịch vụ theo cách thủ công từ dòng lệnh (không sử dụng nohuplệnh tiền tố hoặc &hậu tố để chạy nó trong nền hoặc nói cách khác, chỉ cần chạy lệnh bạn sẽ đặt trên ExecStart=dòng của .servicetệp), điều gì xảy ra?

a) Nếu dịch vụ bắt đầu và tiếp tục chạy và lời nhắc không quay lại cho đến khi bạn nhấn Control-C hoặc dừng dịch vụ theo một cách khác: thì đó Type = simplelà lựa chọn đúng đắn.

b) Nếu lời nhắc trả về nhưng dịch vụ vẫn chạy trong nền (tức là dịch vụ tự tự kích hoạt), thì đó Type = forkinglà lựa chọn đúng đắn.

c) Nếu dịch vụ thực hiện công việc của mình và quay lại dấu nhắc mà không để lại bất cứ thứ gì đang chạy (tức là dịch vụ chỉ điều chỉnh một số cài đặt kernel, gửi lệnh đến một cái gì đó khác hoặc thực hiện một cái gì đó tương tự), thì Type = oneshotcó lẽ là lựa chọn đúng. Trong trường hợp này, ExecStartdịch vụ có thể là lệnh "thiết lập" thứ gì đó và ExecStopsẽ là lệnh tương ứng để "hủy đặt" nó. Loại này thường mang lại lợi ích RemainAfterExit=true, vì vậy systemd sẽ theo dõi "trạng thái" của dịch vụ này tùy theo việc gần đây nhất là "thiết lập" hay "chưa đặt".

Các Typegiá trị khác là trường hợp đặc biệt. Ví dụ: nếu dịch vụ sử dụng kết nối D-Bus, thì đó Type = dbuscó thể là lựa chọn tốt nhất. Nó systemdnhận thức được thực tế và sau đó systemd sẽ theo dõi dịch vụ này (và bất cứ điều gì phụ thuộc vào nó) bằng sự hiện diện của dịch vụ này trên D-Bus.

Để sử dụng Type = notify, quy trình phải có khả năng kết nối với ổ cắm Unix được chỉ định trong biến môi trường $NOTIFY_SOCKETvà báo cáo trạng thái của nó bằng cách viết tin nhắn vào ổ cắm đó bất cứ khi nào cần thiết. Ngoài ra, tệp dịch vụ nên chỉ định NotifyAccesstùy chọn cấp quyền truy cập vào ổ cắm thông báo nếu thích hợp.

Có một tiện ích dòng lệnh systemd-notifyvà chức năng thư viện C sd_notify(3)mà bạn có thể sử dụng để gửi các tin nhắn này, nhưng nếu cả hai đều không phù hợp với yêu cầu của bạn, bạn có thể thực hiện trình gửi tin nhắn của riêng mình. Các thông báo được yêu cầu rất đơn giản và trông giống như các phép gán biến shell: ví dụ, để thông báo rằng dịch vụ đã hoàn thành khởi động và sẵn sàng phục vụ mọi yêu cầu đến, dịch vụ sẽ gửi chuỗi tương đương với đầu ra của printf "READY=1\n"ổ cắm. Xem man 3 sd_notifyđể biết thêm chi tiết về các tin nhắn được công nhận.

Lưu ý: nhiều ứng dụng dịch vụ được thiết kế để có thể di động tới nhiều hệ thống kiểu Unix có thể hoạt động như b) theo mặc định, nhưng có thể được thực hiện để hoạt động như a) bằng cách thêm một tùy chọn (thường được mô tả là "không rẽ nhánh", "tiếp tục chạy trong foreground "," không daemonize "hoặc tương tự). Trong trường hợp đó, nếu tùy chọn không có tác dụng phụ nào khác, thì việc thêm tùy chọn và sử dụng hành vi a) -type sẽ được ưu tiên hơn systemd.


Giả sử tôi bắt đầu apache, loại nào nên được sử dụng?
kittygirl

2
Vâng, làm thế nào bạn sẽ bắt đầu nó bằng tay? Bằng cách chạy apachectl startnhư root, có lẽ? Hãy thử làm nó, và xem những gì sẽ xảy ra. Sau đó chọn a), b) hoặc c) từ câu trả lời của tôi. Tôi cá rằng dấu nhắc trả về và Apache vẫn chạy, vì vậy b) sẽ là câu trả lời.
telcoM

Tôi thực sự thích những lời giải thích bạn đã đưa ra trong câu trả lời của bạn. Bạn có phiền khi thêm một lời giải thích tiếng Anh đơn giản cho trường hợp Type=notify?
Yankee

Mô tả Type=notifythêm.
telcoM
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.