systemd вместо cron

Опубликовано SergeyOs - вт, 11/10/2020 - 22:57

Привык я пользоваться cron'ом, но вот попался сервер, где был закрыт доступ. Чтож, можно воспользоваться systemd и таймерами.

Допустим надо запускать какой-то скрипт (some_script.sh) из домашнего каталога. Для этого в каталоге /etc/systemd/system создаём файл my.service:

[Unit]
Description= test cron service1
Wants=my.timer
 
[Service]
User=root
Group=root
Type=oneshot
ExecStart=/bin/bash /home/user/some_script.sh
 
[Install]
WantedBy=default.target

Сохраняем и проверяем:

#sudo systemctl start my.service

Результат выполнения можно посмотреть в системном журнале:

#journalctl -S today -u my.service

Если всё хорошо, то можно приступить к написанию таймера my.timer, если не отработал, то надо разобраться. Но будем исходить из того что всё хорошо, на поиски ошибок нету времени.

рядом с сервисом надо создать файл my.timer примерно с таким содержанием:

[Unit]
Description= test cron service
Requires=my.service
 
[Timer]
Unit=my.service
OnCalendar= Mon *-*-* 00:20:00
 
[Install]
WantedBy=timers.target

Самым интересным здесь будет опция OnCalendar, её формат "DOW YYYY-MM-DD HH:MM:SS", где DOW - день недели, сокращённо до трёх букв.

Соответственно "Mon *-*-* 00:20:00"  означает, что таймер будет отрабатывать каждый понедельник в 00:20.

Проверить валидность строки можно так:

#systemd-analyze calendar "Mon *-*-* 00:20:00"

Если всё хорошо то вывод будет что-то типа:

Normalized form: Mon *-*-* 00:20:00
  Next elapse: Mon 2020-11-16 00:20:00 MSK
    (in UTC): Sun 2020-11-15 21:20:00 UTC
    From now: 5 days left  

Также можно управлять точностью таймера через опцию AccuracySec в разделе [Timer]. Для точности в микросекунду надо прописать AccuracySec=1usec (остальные опции в #man systemd.timer).

Всё, можно стартовать. 

#sudo systemctl start my.timer

проверяем запущенные таймеры:

#systemctl list-timers

Чтобы таймер запускался после перезагрузки:

#sudo systemctl enable my.timer

Теги