В то время как cron может быть сложным для планирования команд на определенный будний день каждого месяца, systemd предлагает простое решение.
Отображение текущей даты и времени.
$ date
Sun Aug 11 19:10:02 CEST 2024
Определите расписание, по которому таймер должен запускать связанную с ним службу
Определите, когда будет запущено следующее событие в восемь часов.
$ systemd-analyze calendar "*-*-* 08:00:00"
Normalized form: *-*-* 08:00:00 Next elapse: Mon 2024-08-12 08:00:00 CEST (in UTC): Mon 2024-08-12 06:00:00 UTC From now: 12h left
Определите, когда сработает следующее событие в пятницу в восемь часов.
$ systemd-analyze calendar "Fri *-*-* 08:00:00"
Normalized form: Fri *-*-* 08:00:00 Next elapse: Fri 2024-08-16 08:00:00 CEST (in UTC): Fri 2024-08-16 06:00:00 UTC From now: 4 days left
Определите, когда сработает следующее событие в первую пятницу месяца в восемь часов.
$ systemd-analyze calendar "Fri *-*-1..7 08:00:00"
Original form: Fri *-*-1..7 08:00:00 Normalized form: Fri *-*-01..07 08:00:00 Next elapse: Fri 2024-09-06 08:00:00 CEST (in UTC): Fri 2024-09-06 06:00:00 UTC From now: 3 weeks 4 days left
Отображение следующих десяти итераций в подробном виде.
$ systemd-analyze calendar --iterations 10 "Fri *-*-1..7 08:00:00"
Original form: Fri *-*-1..7 08:00:00 Normalized form: Fri *-*-01..07 08:00:00 Next elapse: Fri 2024-09-06 08:00:00 CEST (in UTC): Fri 2024-09-06 06:00:00 UTC From now: 3 weeks 4 days left Iteration #2: Fri 2024-10-04 08:00:00 CEST (in UTC): Fri 2024-10-04 06:00:00 UTC From now: 1 month 23 days left Iteration #3: Fri 2024-11-01 08:00:00 CET (in UTC): Fri 2024-11-01 07:00:00 UTC From now: 2 months 20 days left Iteration #4: Fri 2024-12-06 08:00:00 CET (in UTC): Fri 2024-12-06 07:00:00 UTC From now: 3 months 25 days left Iteration #5: Fri 2025-01-03 08:00:00 CET (in UTC): Fri 2025-01-03 07:00:00 UTC From now: 4 months 22 days left Iteration #6: Fri 2025-02-07 08:00:00 CET (in UTC): Fri 2025-02-07 07:00:00 UTC From now: 5 months 27 days left Iteration #7: Fri 2025-03-07 08:00:00 CET (in UTC): Fri 2025-03-07 07:00:00 UTC From now: 6 months 24 days left Iteration #8: Fri 2025-04-04 08:00:00 CEST (in UTC): Fri 2025-04-04 06:00:00 UTC From now: 7 months 22 days left Iteration #9: Fri 2025-05-02 08:00:00 CEST (in UTC): Fri 2025-05-02 06:00:00 UTC From now: 8 months 20 days left Iteration #10: Fri 2025-06-06 08:00:00 CEST (in UTC): Fri 2025-06-06 06:00:00 UTC From now: 9 months 24 days left
Отображение следующих десяти итераций в коротком виде.
$ systemd-analyze calendar --iterations 10 "Fri *-*-1..7 08:00:00" | sed -n -e "/Iteration/{s|Iteration #[0-9]\+: \(.*\)|\1|;s|^[ ]*||;p}"
Fri 2024-10-04 08:00:00 CEST Fri 2024-11-01 08:00:00 CET Fri 2024-12-06 08:00:00 CET Fri 2025-01-03 08:00:00 CET Fri 2025-02-07 08:00:00 CET Fri 2025-03-07 08:00:00 CET Fri 2025-04-04 08:00:00 CEST Fri 2025-05-02 08:00:00 CEST Fri 2025-06-06 08:00:00 CEST
Отображение следующих десяти итераций в формате JSON.
$ systemd-analyze calendar --iterations 10 "Fri *-*-1..7 08:00:00" | \ sed -n -e "/Iteration/{s|Iteration #[0-9]\+: \(.*\)|\1|;s|^[ ]*||;p}" | \ jq --compact-output --slurp --raw-input 'split("\n")[:-1] | map({date:.})'
[{"date":"Fri 2024-10-04 08:00:00 CEST"},{"date":"Fri 2024-11-01 08:00:00 CET"},{"date":"Fri 2024-12-06 08:00:00 CET"},{"date":"Fri 2025-01-03 08:00:00 CET"},{"date":"Fri 2025-02-07 08:00:00 CET"},{"date":"Fri 2025-03-07 08:00:00 CET"},{"date":"Fri 2025-04-04 08:00:00 CEST"},{"date":"Fri 2025-05-02 08:00:00 CEST"},{"date":"Fri 2025-06-06 08:00:00 CEST"}]
Определите таймер и связанную с ним службу
Определите службу, которая будет выполнять запланированную команду.
$ sudo tee /etc/systemd/system/firstfriday.service <<EOF [Unit] Description=Will be executed on first Friday in a month at eight'o'clock [Service] Type=oneshot ExecStart=/bin/bash -c ":" [Install] WantedBy=multi-user.target EOF
[Unit] Description=Will be executed on first Friday in a month at eight'o'clock [Service] Type=oneshot ExecStart=/bin/bash -c ":" [Install] WantedBy=multi-user.target
Перезагрузите конфигурацию systemd.
$ sudo systemctl daemon-reload
Проверьте, отключена ли служба, так как она должна быть отключена при загрузке.
$ systemctl is-enabled firstfriday.service
disabled
Проверьте состояние сервиса.
$ systemctl status firstfriday.service
* firstfriday.service - Will be executed on first Friday in a month at eight'o'clock Loaded: loaded (/etc/systemd/system/firstfriday.service; disabled; preset: enabled) Active: inactive (dead)
Создайте таймер для созданной услуги по желаемому расписанию.
$ sudo tee /etc/systemd/system/firstfriday.timer <<EOF [Unit] Description=Execute firstfriday service on first Friday in a month at eight'o'clock [Timer] OnCalendar=Fri *-*-1..7 08:00:00 [Install] WantedBy=timers.target EOF
[Unit] Description=Execute firstfriday service on first Friday in a month at eight'o'clock [Timer] OnCalendar=Fri *-*-1..7 08:00:00 [Install] WantedBy=timers.target
Перезагрузите конфигурацию systemd.
$ sudo systemctl daemon-reload
Таймер будет отключен после его создания.
$ systemctl is-enabled firstfriday.timer
disabled
После создания таймер будет неактивен.
$ systemctl is-active firstfriday.timer
inactive
Начальное состояние таймера.
$ systemctl status firstfriday.timer
* firstfriday.timer - Execute firstfriday service on first Friday in a month at eight'o'clock Loaded: loaded (/etc/systemd/system/firstfriday.timer; disabled; preset: enabled) Active: inactive (dead) Trigger: n/a Triggers: * firstfriday.service
Включите таймер.
$ systemctl enable firstfriday.timer
Created symlink /etc/systemd/system/timers.target.wants/firstfriday.timer -> /etc/systemd/system/firstfriday.timer.
Запустите таймер
$ systemctl start firstfriday.timer
Отображение состояния таймера.
$ systemctl list-timers firstfriday
NEXT LEFT LAST PASSED UNIT ACTIVATES Fri 2024-09-06 08:00:00 CEST 3 weeks 4 days - - firstfriday.timer firstfriday.service 1 timers listed. Pass --all to see loaded but inactive timers, too.
$ systemctl status firstfriday.timer
* firstfriday.timer - Execute firstfriday service on first Friday in a month at eight'o'clock Loaded: loaded (/etc/systemd/system/firstfriday.timer; enabled; preset: enabled) Active: active (waiting) since Sun 2024-08-11 20:04:42 CEST; 3s ago Trigger: Fri 2024-09-06 08:00:00 CEST; 3 weeks 4 days left Triggers: * firstfriday.service Aug 11 20:04:42 laptop-gda systemd[1]: Started firstfriday.timer - Execute firstfriday service on first Friday in a month at eight'o'clock.
Отображение состояния обслуживания.
$ systemctl status firstfriday.service
* firstfriday.service - Will be executed on first Friday in a month at eight'o'clock Loaded: loaded (/etc/systemd/system/firstfriday.service; disabled; preset: enabled) Active: inactive (dead) TriggeredBy: * firstfriday.timer
- 🌐 Управление заданиями Cron на нескольких серверах с помощью Dkron
- 🐧 Как предотвратить случайное удаление записей Crontab на Linux
- 🐧 Использование CRON для мониторинга и уведомления о состоянии служб на Linux
- Как запретить пользователю, не являющемуся пользователем root, создание записи crontab
- Как разрешить только конкретным пользователям без полномочий root использовать crontab
- Как сделать ежедневные резервные копии с помощью rsync и cronjobs