Как настроить Systemd Timer для запуска службы в последний день месяца

Я хочу запустить файл службы в последний день каждого месяца. Как это настроить? Я имею в виду Systemd.timers, но не могу найти правильный подход.

Кроме того, можно будет добавить еще одну конфигурацию для запуска в последний рабочий день месяца? (дней, кроме солнца и сидел)

  • «Systemctl list-timers» показывает последние выполненные даты, которые далеки в будущем
  • Периодически выполняемый btrfs-scrub
  • Как узнать, какая команда выполняется файлом systemd .timer?
  • Есть ли способ узнать, когда будет запускаться системный таймер?
  • Поручить выполнить блок после успешного завершения работы другого устройства
  • Каков правильный способ отключения блока таймера systemd?
  • systemd: изящно сбой резервного копирования, когда внешний диск не подключен
  • systemd запустить блок на успех другого
  • 2 Solutions collect form web for “Как настроить Systemd Timer для запуска службы в последний день месяца”

    Начиная с версии 233, systemd поддерживает использование «~» в своем синтаксисе календаря для указания дат относительно конца месяца.

    OnCalendar=*-02~03 означает третий последний день февраля (26 или 27-й, в зависимости от того, является ли он високосным годом)

    Mon *-05~07/1 Mon *-05~01..07 и Mon *-05~01..07 являются синонимами в последний понедельник мая.

    https://github.com/systemd/systemd/blob/v233/NEWS#L174

    Самое простое решение, вероятно, использовать таймер, который работает каждый день, и проверяет, будет ли завтра 1-го числа месяца. Что-то вроде:

    mytimer.timer:

     [Unit] Description=run mytimer.service daily at 6am [Timer] OnCalendar=6:00 Persistent=true [Install] WantedBy=timers.target 

    mytimer.service:

     [Unit] Wants=mytimer.timer Description=run on last day of month [Service] Type=oneshot ExecStart=/bin/bash -c '[ $(date --date=tomorrow +%d) -eq 1 ] && \ /bin/myscript' 

    В течение последнего рабочего дня месяца я вычисляю его как: смотрю 3 дня в будущем и проверяю, является ли дата третьей, а день – с четверга по понедельник включительно или дата 1 или 2, а день Понедельник. Эквивалентный тест bash с использованием даты и% w для дня недели (0 = воскресенье) будет

     [[ $(date --date=+3days +%d%w) =~ 03[45601]|011|021 ]] 
    Linux и Unix - лучшая ОС в мире.