Có SystemD sinh ra N quá trình?


12

Tại tổ chức của tôi, chúng tôi có một số quy trình nhân viên tiêu thụ hàng đợi. Chúng tôi hiện đang sử dụng Trình giám sát để quản lý chúng, nhưng muốn sử dụng SystemD nếu có thể vì những lợi thế nhất định trong đó. Tôi khá có kinh nghiệm với việc viết các đơn vị tùy chỉnh, nhưng tôi không ngay lập tức có một điểm tương tự trong vùng SystemD cho việc này.

Trong tài liệu Người giám sát, một tham số được gọi numprocslà chi tiết cho phép một người đặt số lượng quy trình họ muốn được bắt đầu với dịch vụ. Nếu tôi muốn 30 quy trình bắt đầu, đó là thay đổi một dòng.

Có một cài đặt nào trong các đơn vị SystemD sẽ cho phép tôi chỉ định bao nhiêu trong số các quy trình này tôi muốn bắt đầu không?


1
Bạn đang cố gắng tạo nhiều phiên bản của cùng một đơn vị? Nếu vậy, bạn có thể muốn xem 0pulum.de/blog/projects/instances.html
Munir

Câu trả lời:


30

Những gì Munir đề cập chính xác là cách bạn làm điều này. Về cơ bản, bạn tạo một servicetập tin và bắt đầu nó 30 lần. Bây giờ điều đó có vẻ hơi khó chịu, nhưng nó có những lợi thế, chẳng hạn như có thể tắt một trong số chúng nếu nó hoạt động sai, và không phải tắt tất cả chúng. Ngoài ra còn có một số điều bạn có thể làm để quản lý dễ dàng hơn.

Đầu tiên, tập tin đơn vị. Tạo một tập tin, chẳng hạn như /etc/systemd/system/test@.service. Các bit quan trọng là @biểu tượng.

Nội dung của nó có thể trông giống như:

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

Sau đó bắt đầu nó với systemctl start test@1.service, systemctl start test@2.service.
Các quy trình được khởi chạy sẽ trông như sau:

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

Lưu ý rằng %Iđã thay thế bằng bất cứ thứ gì bạn đặt sau @khi bạn bắt đầu nó.

Bạn có thể bắt đầu tất cả 30 với một ít shell-fu:

systemctl start test@{1..30}.service

Bạn cũng có thể kích hoạt chúng khi khởi động như mọi dịch vụ bình thường : systemctl enable test@1.service.

 

Bây giờ, ý của tôi là những điều bạn có thể làm để giúp quản lý dễ dàng hơn: Có thể bạn không muốn phải sử dụng test@{1..30}.serviceđể quản lý tất cả. Đó là một chút khó khăn. Thay vào đó, bạn có thể tạo một mục tiêu mới cho dịch vụ của mình.

Tạo /etc/systemd/system/test.targetbằng:

[Install]
WantedBy=multi-user.target

Sau đó điều chỉnh /etc/systemd/system/test@.servicesao cho giống như:

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

Tải lại systemd bằng systemctl daemon-reload(chỉ cần thiết nếu bạn đang sửa đổi tệp đơn vị và không bỏ qua phiên bản trước đó của nó). Và bây giờ kích hoạt tất cả các dịch vụ bạn muốn được quản lý bằng cách thực hiện systemctl enable test@{1..30}.service.
(Nếu trước đây bạn đã kích hoạt dịch vụ trong khi có WantedBy=multi-user.target, hãy tắt dịch vụ trước để xóa phần phụ thuộc)

Bây giờ bạn có thể làm systemctl start test.targetsystemctl stop test.target, nó sẽ bắt đầu / dừng tất cả 30 quy trình.
Và một lần nữa, bạn có thể kích hoạt khi khởi động như bất kỳ tệp đơn vị nào khác : systemctl enable test.target.


Cảm ơn bạn đã trả lời chi tiết này, tôi đã tìm kiếm này trong vài ngày.
arnolem

1
Bạn có biết nếu điều đó sẽ khởi động lại các quá trình thất bại?
bastian

@bastian: bạn có thể sử dụng Restart=on-failure. Đọc systemd.servicetrang người đàn ông để biết thêm.
siride

1

Dưới đây là ví dụ của tôi bằng cách sử dụng tập lệnh python chạy trong virtualenv:

/etc/systemd/system/my-worker@.service

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

Vô hiệu hóa: sudo systemctl enable my-worker\@{1..30}.service

Cho phép N công nhân: sudo systemctl enable my-worker\@{1..2}.service

Tải lại: sudo systemctl daemon-reload

Khởi đầu: sudo systemctl start my-worker@2.service

Kiểm tra trạng thái: sudo systemctl status my-worker@1

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.