Bắt đầu / dừng dịch vụ systemd.service vào những thời điểm cụ thể


14

Tôi muốn bắt đầu và dừng một systemd.service vào những thời điểm cụ thể. Có lẽ tôi sẽ sử dụng một đơn vị .timer để bắt đầu công việc, nhưng có cách nào được xây dựng để dừng công việc sau một thời gian cụ thể hoặc tại một thời điểm cụ thể hay tôi phải tạo một đơn vị .timer thứ hai thực thi stop?

Cảm ơn

Câu trả lời:


6

Để dừng dịch vụ A bằng bộ hẹn giờ, bạn có thể tạo dịch vụ B loại oneshotmà nó sẽ xung đột với, sau đó sử dụng bộ hẹn giờ để khởi động dịch vụ B.

Nếu một đơn vị có Xung đột = cài đặt trên đơn vị khác, bắt đầu đơn vị trước sẽ dừng đơn vị sau và ngược lại. ( nguồn )

A. dịch vụ:

[Unit]
Conflicts=B.service
...

B. dịch vụ:

[Unit]
Description=B service description

[Service]
Type=oneshot
ExecStart=/bin/echo ''

Trả lời:

[Timer]
AccuracySec=1
OnActiveSec=10

[Install]
WantedBy=timers.target

Sau đây sẽ dừng dịch vụ A sau 10 giây.

systemctl start A.service
systemctl start B.timer

2

Thực sự có một cách khác để dừng một dịch vụ sau khi thời gian chạy nhất định được cấu hình trong .servicetệp.

RuntimeMaxSec=...

Bạn có thể không thích thực tế là dịch vụ được coi là thất bại nhưng đó là kết quả hợp lý ít nhiều hợp lý của việc giết chết một dịch vụ dài hạn.

Để có câu trả lời tốt hơn, bạn có thể muốn giải thích lý do của mình để sử dụng một tính năng khác thường như vậy. Các dịch vụ thường có nghĩa là chạy mãi mãi hoặc cho đến khi chúng bị dừng rõ ràng, không chỉ trong một khoảng thời gian cố định.


1
Có, chúng tôi đã thảo luận về vấn đề này và những hạn chế của nó trong danh sách gửi thư: list.freedesktop.org/archives/systemd-devel/2016-April/ Kẻ
Jamie Kitson

1
Không phải bất thường. Điều gì về việc chạy một dịch vụ đòi hỏi tài nguyên, có lẽ là SETI, chỉ vào ban đêm, khi máy chủ có lưu lượng truy cập ít nhất. Ngoài ra, nơi tôi làm việc, chúng tôi có một trình nền cảnh báo được thiết kế để đánh thức nhóm hỗ trợ qua điện thoại của họ khi có ngoại lệ trên máy chủ. Chúng tôi thực sự không muốn thứ phiền toái đó chạy khi chúng tôi thực sự thức vì những máy chủ đó có vấn đề trái và phải trong quá trình sử dụng cao điểm.
James M. Lay

0

Bạn có thể sử dụng một vài công việc định kỳ:

 # ┌───────────── phút tối thiểu (0 - 59) 
 # │ ────────────── giờ (0 - 23)
 # │ ─
 # │ ─
 # │ │ ─
 # │ │
 # │ │
   * * * * * systemctl bắt đầu $ SERVICE.service
   * * * * * systemctl dừng $ SERVICE.service

Thông tin thêm về cron: https://en.wikipedia.org/wiki/Cron , https://wiki.archlinux.org/index.php/Cron


8
Làm thế nào một công việc định kỳ là một cải tiến so với .timercác đơn vị systemd mà OP đã biết?
Pavel imerda

Tôi có thể, vâng, nhưng câu hỏi của tôi thực sự là làm thế nào để làm điều này đúng với systemd? Tôi cho rằng phải có một số cách tiêu chuẩn để khiến một công việc dừng lại ở một thời điểm cụ thể hoặc sau một thời gian nhất định.
Jamie Kitson

@JamieKitson Thành thật mà nói tôi không nghĩ thực sự cần phải có một tính năng như vậy ngoài bộ định thời cron và systemd. Hầu hết cài đặt systemd sẽ không bao giờ sử dụng các tính năng như vậy và không có gì sai khi chạy systemctlbằng cron, bộ định thời systemd và bất cứ thứ gì bạn thích. Theo tôi câu trả lời này có giá trị như bất kỳ câu trả lời nào khác.
Pavel imerda

Ví dụ, làm thế nào để bạn cho phép dữ liệu www chạy systemctl start & stop?
alvaropgl

@alvaropgl Nhận xét của bạn không liên quan gì đến người dùng (dữ liệu www) và quyền truy cập hạn chế nào họ có thể phải chạy / không chạy quy trình (systemctl), đó là chủ đề. Xin bắt đầu một chủ đề mới. Gợi ý: bạn có thể muốn xem xét việc tạo API để làm những việc bạn muốn, thay vì cách tiếp cận hiện tại của bạn là cho phép nhiều trách nhiệm + phạm vi hơn đối với người dùng dữ liệu www.
Scott Prive
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.