Запускать скрипт каждые 30 минут с помощью systemd

20

Я хотел бы выполнять скрипт каждые 30 минут после загрузки в систему. Я знаю, что вы можете использовать cron, но я не планирую использовать эту функцию часто, поэтому я хотел бы попробовать ее с systemd.

До сих пор я нашел только монотонные таймеры, которые позволяют выполнить что-то один раз (по крайней мере, я так думаю). Как бы foo.timerи foo@user.serviceвыглядело, если бы я хотел что-то запускать каждые 30 минут после загрузки / запуска системы?

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... ???
TomTom
источник

Ответы:

26

Вам нужно создать два файла: один для сервиса, другой для таймера с тем же именем.

пример:

/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

после этого перезагрузите systemd с помощью команды systemctl daemon-reloadи запустите таймер systemctl start test.timerили включите их по умолчанию.

содержание теста 1.sh

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

И команда для проверки всех доступных таймеров: systemctl list-timers --all

Более подробная информация на странице проекта и примеры на странице ArchLinux

Reishin
источник
systemd принимает сценарии, и он указан в списке, однако ничего не происходит
TomTom
который из? должно быть два сценария, один таймер и другой сервис. Время, когда они казнили можно проверить с помощью команды список-таймеры, возможные ошибки могут быть проверены systemctl status test.timerи systemctl status test.servicecomamand
Reishin
1
пожалуйста, используйте systemctl list-timers --allкоманду и проверьте вывод. Он должен быть таким . Посмотрите на единицу, слева и пропущенные столбцы Если таймер присутствует, пожалуйста, посмотрите на ваш сервисный файл и проверьте на наличие ошибок, так как таймер работает нормально.
Рейшин
1
нет, потому что главный вопрос не задает ничего о «уведомить-отправить», и я думаю, что мы не должны смешивать две разные вещи, когда такая тема уже существует. в вашем случае попробуйте добавить export DISPLAY=:0.0в скрипт.
Рейшин
1
ps: согласно man systemd.timer, Persistent = true влияет только на настроенный с OnCalendar (то есть wallclock)
snyh
11

Вот еще один вариант без использования вашего таймера. Если время не очень важно и сценарий не работает долго, это будет хорошо для простых вещей.

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh
Мэтт Н
источник
2
Мне нравится это решение. Единственным существенным недостатком является то, что системные журналы будут заполнены журналами «Запуск <service X>», если вы часто перезагружаетесь (то есть каждые 30 секунд). В этот момент может быть лучше запустить службу как демон, а не перезапускать службу снова и снова из systemd.
Джерси боб
Это правда. Для быстрых и простых вещей это работает. Но таймер или длительный скрипт будет лучшим решением.
Мэтт Х