Làm thế nào để ngăn chặn tất cả các đơn vị thuộc cùng một mục tiêu?


9

Tôi đang tự hỏi làm thế nào để ngăn chặn tất cả các đơn vị được nhóm lại với nhau bởi cùng một mục tiêu.

Thiết lập của tôi là như sau. Tôi có một số tập tin cấu hình đơn vị đọc:

[Unit]
...

[Service]
...

[Install]
WantedBy=mycustom.target

Khi tôi chạy

# systemctl start mycustom.target

Những đơn vị "được muốn bởi" mycustom.targetbắt đầu chính xác. Bây giờ, tôi cũng muốn có thể dừng tất cả các đơn vị đang muốn mycustom.target. Tôi đã thử:

# systemctl stop mycustom.target

Điều này không làm bất cứ điều gì mặc dù. Có cách nào để thực hiện công việc này mà không phải dừng tất cả các đơn vị (rõ ràng) muốn cùng một mục tiêu không?

Câu trả lời:


26

Sử dụng PartOf=chỉ thị.

Định cấu hình các phụ thuộc tương tự như Yêu cầu =, nhưng giới hạn ở việc dừng và khởi động lại các đơn vị. Khi systemd dừng hoặc khởi động lại các đơn vị được liệt kê ở đây, hành động được truyền đến đơn vị này. Lưu ý rằng đây là phụ thuộc một chiều - các thay đổi đối với đơn vị này không ảnh hưởng đến các đơn vị được liệt kê.

PartOf=mycustom.target


1
Tôi nên kết hợp nó với StopWhenUnneededhoặc nó được ngụ ý?
PSSGCSim

Có vẻ như StopWhenUnneededkhông cần thiết khi sử dụng PartOf. @PSSGCSim
Gary van der Merwe

9

Chỉnh sửa: PartOf=chỉ thị, không tồn tại tại thời điểm viết câu trả lời này, là một giải pháp tốt hơn. Xem câu trả lời khác để biết chi tiết.

Có hai cách: ngầm và rõ ràng.

Cách thứ nhất - StopWhenUnneeded=

Cách đầu tiên là sử dụng StopWhenUnneeded=chỉ thị. Nếu một đơn vị có StopWhenUnneeded=yes, nó sẽ tự động dừng lại khi không có đơn vị hoạt động nào Wants=/ Requires=đơn vị được đề cập. Vì thế:

  • điều này sẽ chỉ hoạt động nếu các đơn vị này WantedBy= chỉ bằng mycustom.target;
  • bạn sẽ không thể khởi động bất kỳ đơn vị nào trong số này một cách thủ công (tức là systemctl start myunit.servicesẽ khởi động nó và ngay lập tức dừng nó sau đó).

Cách thứ hai - một đường ống vỏ

Cách thứ hai là xây dựng một đường ống vỏ đơn giản, sử dụng systemctl show -pđể trích xuất danh sách phụ thuộc của mycustom.target.

Cụ thể hơn, systemctl show UNITsẽ hiển thị tất cả các thuộc tính của một đơn vị ở dạng KEY = VALUE và systemctl show -p PROPERTIES UNITsẽ làm tương tự, giới hạn tập các thuộc tính được hiển thị. Vì thế:

systemctl stop -- $(systemctl show -p Wants mycustom.target | cut -d= -f2)
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.