Systemd: Khởi động lại tất cả các phiên bản của Dịch vụ được tạo ngay lập tức


17

Tôi sử dụng tính năng hay của systemd: Instantiated Services.

Có cách nào đơn giản để tải lại tất cả các dịch vụ được khởi tạo bằng một cuộc gọi không?

Ví dụ: Tôi không muốn chạy tất cả như thế này:

systemctl restart autossh@foo
systemctl restart autossh@bar
systemctl restart autossh@blu

Tôi đã thử nó, nhưng nó không hoạt động

systemctl restart autossh@*

Liên quan: Bắt đầu N quy trình với một tệp dịch vụ systemd

Cập nhật

Đầu tiên tôi bị cuốn hút bởi Dịch vụ tức thời, nhưng sau đó tôi nhận ra rằng việc chạy một công cụ quản lý cấu hình như Ansible có ý nghĩa hơn. Tôi đã học được: Giữ cho các công cụ đơn giản. Nhiều công cụ bắt đầu thực hiện kiểm tra điều kiện (nếu .. khác ...) và các vòng lặp. Ví dụ: máy chủ web hoặc cấu hình mailserver. Nhưng điều này cần được giải quyết ở một cấp độ khác (trên): quản lý cấu hình. Xem: https://github.com/guettli/programming-guferences#dont-use-systemd-instantiated-units

Câu trả lời:


23

Systemd (bắt đầu từ systemd-209) hỗ trợ các ký tự đại diện, tuy nhiên trình bao của bạn có thể đang cố gắng mở rộng chúng. Sử dụng dấu ngoặc kép để truyền ký tự đại diện cho lệnh systemctl / service verbatim:

systemctl restart 'autossh@*'

Không hoạt động đối với tôi: systemctl status 'autossh@*'đầu ra: autossh@\x2a.service - ... Active: inactive (dead)Phiên bản:systemd 195
guettli

2
Globbing có sẵn bắt đầu từ systemd 209 : lists.freedesktop.org/archives/systemd-devel/2014-F / 2 / trộm
lạan

Nếu bạn có nhiều dịch vụ để khởi động lại, vòng lặp while trong câu trả lời của guettli sẽ hoạt động tốt hơn, vì ký tự đại diện dường như cố gắng khởi động lại tất cả chúng cùng một lúc. Đã thử nghiệm với ~ 1000 dịch vụ php-fpm, tải lên tới 400 và tôi phải khởi động lại máy chủ.
boutch55555

1
Hoạt động nếu các quy trình đang chạy, nhưng không phải nếu chúng phải được bắt đầu lần đầu tiên sau khi chúng được kích hoạt. Nhưng bạn có thể sử dụng systemctl restart autossh@{1..2}(với bất kỳ N thay vì 2) ít chung chung hơn nhưng nó cũng sẽ bắt đầu các quy trình nếu có inactive (dead).
giorgiosironi

7

Không đẹp, nhưng điều này hoạt động cho các hệ thống có hệ thống cũ:

systemctl list-units -t service --full| cut -d' ' -f1| grep mypattern | while read s; do systemctl restart $s; done

Tất nhiên giải pháp từ câu trả lời trên ( systemctl restart 'autossh@*') là tốt hơn.


Chú ý: cutcó thể phân tích trường sai trong trường hợp có dịch vụ không thành công trong đầu ra đơn vị danh sách.
Juuso Ohtonen

5

@weirdan Trả lời là đúng, nhưng thiếu một cái gì đó cho các bản phân phối nhất định.

Đối với Centos 7 và tương tự , bạn có thể làm:

systemctl (start|stop|restart|status) my-service@*

NHƯNG, (bắt đầu) sẽ CHỈ hoạt động, nếu bạn chỉ định cờ "--all":

systemctl (start) my-service@* --all

Mặt khác, nó sẽ không tìm thấy các dịch vụ, vì chúng không tồn tại. Đây là tính năng dự định systemd.

Đối với các hệ thống dựa trên Ubuntu , nó hoạt động khá giống nhau, nhưng điểm khác biệt là, cờ "--all" phải được chỉ định cho tất cả các đối số systemctl, nếu không nó sẽ không làm gì cả.

systemctl (start|stop|restart|status) 'my-service@*' --all

2

Tôi không biết nếu nó có một tùy chọn cho ký tự đại diện trên thiết bị đầu cuối cho systemd. Những gì bạn có thể làm là thêm một cái vào tập lệnh systemd của bạn.

% Tôi sẽ thực hiện thủ thuật mà tôi nghĩ nhưng có liên quan đến cách bạn viết kịch bản các dịch vụ được khởi tạo.

Bạn có thể tìm thấy một lời giải thích ở đây được gọi là specifier

cho thấy:

% n

tên đơn vị đầy đủ

% p

Đối với các đơn vị được khởi tạo, điều này đề cập đến chuỗi trước ký tự "@" của tên đơn vị. Đối với các đơn vị không khởi tạo, điều này đề cập đến tên của đơn vị với loại hậu tố loại bỏ.

%Tôi

Đối với các đơn vị được khởi tạo: đây là chuỗi giữa ký tự "@" và hậu tố của tên đơn vị. Tên đơn vị

Tôi không trực tiếp trả lời câu hỏi của bạn, nhưng với những gì tôi đoán bạn đang cố gắng đạt được. Nếu bạn nghĩ rằng giải pháp của bạn có thể được tìm thấy theo ý tưởng này, vui lòng chia sẻ tập lệnh systemd của bạn, để cuối cùng chúng tôi có thể minh họa bằng các ví dụ và thậm chí có thể cung cấp cho bạn tập lệnh cuối cùng.

Nếu bạn cảm thấy tự tin khi chỉnh sửa tập lệnh của riêng mình để đạt được giải pháp theo cách đó, thì ở đây bạn có một ví dụ (tôi sẽ không trích dẫn vì tôi không biết liệu nó có phù hợp với giải pháp không và quá cụ thể với những gì tôi ' m đề xuất)

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.