Uruchamiaj skrypt co 30 minut z systememd


20

Chciałbym wykonywać skrypt co 30 minut po uruchomieniu systemu. Wiem, że możesz używać crona, ale nie planuję często używać tej funkcji, dlatego chciałbym wypróbować ją z systememd.

Do tej pory znalazłem monotoniczne timery, które pozwalają wykonać coś raz (przynajmniej tak mi się wydaje). Jak wyglądałby foo.timeri foo@user.servicewyglądałby, gdybym chciał wykonać coś co 30 minut od startu / uruchomienia systemu?

foo@user.service

[Unit]
Description=run foo
Wants=foo.timer

[Service]
User=%I
Type=simple
ExecStart=/bin/bash /home/user/script.sh

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???

Odpowiedzi:


26

Musisz utworzyć dwa pliki: jeden do serwisu, drugi do timera o tej samej nazwie.

przykład:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

[Install]
WantedBy=timers.target

następnie ponownie załaduj systemd za pomocą polecenia systemctl daemon-reloadi uruchom licznik do systemctl start test.timerlub włącz je domyślnie.

zawartość testowa 1.sh

#!/bin/bash
echo `date` >> /tmp/2

I polecenie sprawdzenia wszystkich dostępnych timerów: systemctl list-timers --all

Bardziej szczegółowe informacje na stronie projektu i przykłady na stronie ArchLinux


systemd akceptuje skrypty i jest na liście, jednak nic się nie dzieje
TomTom

Który? powinny być dwa skrypty, jeden licznik czasu i inna usługa. Czas, kiedy zostały wykonane, można sprawdzić poleceniem list-timers, Możliwe błędy mogą być sprawdzone przez systemctl status test.timeri systemctl status test.servicecomamand
Reishin

1
użyj systemctl list-timers --allpolecenia i sprawdź dane wyjściowe. Musiał być jak ten . Spójrz na jednostki, lewe i przekazane kolumny. Jeśli timer jest obecny, sprawdź plik usługi i sprawdź, czy nie ma tam błędów, ponieważ zegar działa normalnie.
Reishin

1
nie, bo główne pytanie nie pyta o „powiadom-wyślij” i myślę, że nie powinniśmy mieszać dwóch różnych rzeczy, gdy taki temat jest już obecny. w twoim przypadku spróbuj dodać export DISPLAY=:0.0do skryptu.
Reishin

1
ps: według man systemd.timer Trwałość = prawda ma wpływ tylko na skonfigurowany z OnCalendar (tj.
zegar ścienny

11

Oto kolejna opcja bez używania timera. Jeśli czas nie jest zbyt krytyczny, a skrypt nie działa długo, wystarczy na proste rzeczy.

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh

2
Podoba mi się to rozwiązanie. Jedyną poważną wadą jest to, że dzienniki systemowe zostaną zalane dziennikami „Uruchamianie <usługa X>”, jeśli często się restartujesz (tj. Co 30 sekund). W tym momencie może być lepiej uruchomić usługę jako demon, zamiast restartować usługę raz po raz z systemd.
jersey bean

To prawda. Działa szybko i prosto. Ale lepszym rozwiązaniem byłby licznik czasu lub długo działający skrypt.
Matt H
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.