Uruchom / zatrzymaj usługę systemd. W określonych godzinach

14

Chcę uruchomić i zatrzymać usługę systemd.w określonych godzinach. Prawdopodobnie użyję jednostki .timer, aby rozpocząć zadanie, ale czy istnieje wbudowany sposób, aby zatrzymać zadanie po określonym czasie lub w określonym czasie , czy też muszę utworzyć drugą jednostkę .timer, która wykonuje stop?

Dzięki

Jamie Kitson
źródło

Odpowiedzi:

6

Aby zatrzymać usługę A za pomocą timera, możesz utworzyć usługę B typu oneshot, z którą będzie ona w konflikcie , a następnie użyć timera, aby uruchomić usługę B.

Jeśli jednostka ma ustawienie Konflikty = na innej jednostce, uruchomienie pierwszej spowoduje zatrzymanie drugiej i odwrotnie. ( źródło )

Serwis:

[Unit]
Conflicts=B.service
...

B. usługa:

[Unit]
Description=B service description

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

B.timer:

[Timer]
AccuracySec=1
OnActiveSec=10

[Install]
WantedBy=timers.target

Następujące czynności zatrzymają usługę A po 10 sekundach.

systemctl start A.service
systemctl start B.timer
Radivarig
źródło
2

Możesz użyć kilku zadań cron:

 # ┌───────────── min (0 - 59) 
 # │ ┌────────────── godziny (0-23)
 # │ │ ┌─────────────── dzień miesiąca (1-31)
 # │ │ │ ┌──────────────── miesiąc (1-12)
 # │ │ │ │ ┌───────────────── dzień tygodnia (0 - 6)
 # │ │ │ │ │
 # │ │ │ │ │
   * * * * * systemctl uruchom $ SERVICE.service
   * * * * * systemctl stop $ SERVICE.service

Więcej informacji na temat cron: https://en.wikipedia.org/wiki/Cron , https://wiki.archlinux.org/index.php/Cron

John Moon
źródło
8
W jaki sposób praca crona jest ulepszeniem w stosunku do systemowych .timerjednostek, które OP już zna?
Pavel Šimerda
Mógłbym tak, ale moje pytanie naprawdę brzmi, jak to zrobić poprawnie z systemd? Zakładam, że musi istnieć jakiś standardowy sposób na znalezienie pracy, aby zatrzymać się w określonym czasie lub po określonym czasie.
Jamie Kitson
@JamieKitson Szczerze mówiąc, nie sądzę, że tak naprawdę musi istnieć taka funkcja poza cron i systemowymi licznikami czasu. Większość instalacji systemowych nigdy nie używa takich funkcji i nie ma nic złego w uruchamianiu systemctlza pomocą crona, systemd timerów i cokolwiek zechcesz. Moim zdaniem ta odpowiedź jest tak samo ważna jak każda inna odpowiedź.
Pavel Šimerda
w jaki sposób pozwalasz na przykład na www-data uruchomić systemctl start & stop?
alvaropgl
@alvaropgl Twój komentarz nie ma nic wspólnego z użytkownikami (www-data) i jakim ograniczonym dostępem mogą mieć do uruchamiania / uruchamiania procesów (systemctl), co jest tematem. Rozpocznij nowy temat. Wskazówka: prawdopodobnie chcesz spojrzeć na tworzenie interfejsu API do robienia rzeczy, które chcesz, a nie na obecne podejście polegające na zwiększeniu odpowiedzialności + zakresu dla użytkownika danych www.
Scott Prive
2

Rzeczywiście istnieje inny sposób zatrzymania usługi po określonym środowisku wykonawczym skonfigurowanym w .servicepliku.

RuntimeMaxSec=...

Może ci się nie podobać fakt, że usługa jest uważana za nieudaną, ale jest to mniej lub bardziej logiczny skutek zabicia długotrwałej usługi.

Aby uzyskać lepszą odpowiedź, możesz wyjaśnić swoje uzasadnienie korzystania z tak niezwykłej funkcji. Usługi mają na ogół działać wiecznie lub do czasu ich wyraźnego zatrzymania, nie tylko na określony czas.

Pavel Šimerda
źródło
1
Tak, dyskutowaliśmy o tym i jego ograniczeniach na liście mailingowej: lists.freedesktop.org/archives/systemd-devel/2016-April/…
Jamie Kitson
1
Nie niezwykłe. Co z uruchomieniem wymagającej zasobów usługi, być może SETI, tylko w nocy, gdy serwer uzyskuje najmniejszy ruch. Poza tym tam, gdzie pracuję, mamy demona alertów, który ma obudzić zespół pomocy technicznej przez ich telefony, gdy na serwerach wystąpi wyjątek. Naprawdę nie chcemy, aby ta irytująca rzecz działała, kiedy faktycznie nie śpimy, ponieważ te serwery mają problemy z lewej i prawej strony podczas szczytowego użytkowania.
James M. Lay