Ngã ba trong một kịch bản systemd


10

Tôi muốn dịch vụ systemd xử lý forking (tệp của tôi không tự xử lý forking. Vì vậy, tôi đang dựa vào systemd để xử lý việc đó)

Tệp dịch vụ của tôi:

[Unit]
Description=swamp services management service
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/swamp

[Install]
WantedBy=multi-user.target

Câu hỏi

Là chỉ định Type=forkingđủ cho những gì tôi đang cố gắng để đạt được? Hoặc tương tự như mong đợi khi bắt đầu khởi động mà thực sự nói lên (nếu tôi hiểu chính xác, không chắc chắn tôi làm, tôi mới viết văn bản) rằng dịch vụ của tôi sẽ xử lý việc giả mạo / trình bày.

Câu trả lời:


16

systemd có tài liệu tuyệt vời. Xem trang trên tệp dịch vụ :

Nếu được đặt thành forking, dự kiến ​​quy trình được cấu hình với ExecStart = sẽ gọi fork () là một phần của quá trình khởi động. 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 truyền thông được thiết lập. Đứa trẻ tiếp tục chạy như là quá trình daemon chính. Đây là hành vi của daemon UNIX truyền thống. Nếu cài đặt này được sử dụng, bạn cũng nên sử dụng tùy chọn PIDFile = để systemd có thể xác định quy trình chính của daemon. systemd sẽ tiến hành bắt đầu các đơn vị theo dõi ngay khi tiến trình cha mẹ thoát ra.

Vì vậy, sử dụng điều đó typesẽ chỉ bảo systemd đợi cho đến khi swamptrả về và sau đó coi nó vẫn đang chạy: làm cho điều đó xảy ra vẫn là trách nhiệm của bạn ...


5
Nếu tập lệnh không thực hiện bất kỳ thao tác giả nào, thì đó là oneshot(một tập lệnh chạy ngắn điển hình) hoặc simple(một dịch vụ chạy dài mà không rẽ nhánh + thoát).
Pavel imerda

4
Bạn có xem xét một tập lệnh (Bash?) Để rẽ nhánh một quá trình khác khi nó chạy nền bằng cách sử dụng ký hiệu &không?
Felipe Alvarez

5
@FelipeAlvarez có, toán tử ampersand trong bash tương đương với một ngã ba và exec.
Thayne

1

Nếu bạn muốn systemd xử lý forking, thì bạn nên sử dụng eg Type=simplehoặc Type=notify. Sau đó systemd sẽ làm forking cho bạn.

Nếu bạn có thể sửa đổi swampthực thi, thì đó Type=notifylà giải pháp tốt nhất. Việc thực thi sau đó sẽ thông báo cho systemd khi nó được khởi tạo thành công. Điều này có nghĩa là systemctl start swampsẽ đợi đầm lầy khởi tạo khi được gọi từ dòng lệnh và in bất kỳ thông báo lỗi nào trong khi khởi tạo dòng lệnh, đó là điều bạn thường muốn.

Để biết ví dụ về một tệp thực thi được viết để sử dụng Type = notify, hãy xem shellscript sau:

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000
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.