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 nohup
lệ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 .service
tệ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 = simple
là 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 = forking
là 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 = oneshot
có lẽ là lựa chọn đúng. Trong trường hợp này, ExecStart
dịch vụ có thể là lệnh "thiết lập" thứ gì đó và ExecStop
sẽ 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 Type
giá 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 = dbus
có thể là lựa chọn tốt nhất. Nó systemd
nhậ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_SOCKET
và 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 NotifyAccess
tù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-notify
và 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
.
apache
, loại nào nên được sử dụng?