Что такое таймеры в systemd и как их использовать для планирования задач?

Ответ

Таймеры (.timer) в systemd — это юниты для планирования задач, современная и более мощная альтернатива cron. Они предназначены для активации других юнитов (обычно сервисов — .service) по расписанию или по событию.

Ключевые преимущества перед cron:

  • Интеграция с системой: Полная интеграция с journald для структурированного логирования, управление через systemctl.
  • Зависимости: Могут использовать систему зависимостей systemd (например, запускать задачу только после монтирования определённого раздела).
  • Гибкое расписание: Поддержка календарных выражений (например, Mon..Fri), относительных интервалов и активации по событию загрузки.
  • Persistent mode: Опция Persistent=true гарантирует выполнение пропущенной задачи при следующем запуске системы.

Пример: Ежедневное резервное копирование

  1. Сервис (/etc/systemd/system/backup.service): Определяет что выполнять.

    [Unit]
    Description=Database backup job
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/backup-script.sh
    User=backup-user
  2. Таймер (/etc/systemd/system/backup.timer): Определяет когда выполнять.

    [Unit]
    Description=Run backup daily at 2 AM
    
    [Timer]
    OnCalendar=*-*-* 02:00:00
    Persistent=true
    
    [Install]
    WantedBy=timers.target
  3. Активация и управление:

    # Включить таймер для автозапуска
    sudo systemctl enable backup.timer
    # Запустить таймер немедленно
    sudo systemctl start backup.timer
    # Просмотр статуса и следующего времени срабатывания
    systemctl status backup.timer
    # Просмотр логов выполнения задачи
    journalctl -u backup.service

Типичные сценарии в DevOps: планирование очистки логов, запуск синхронизации конфигураций, выполнение периодических health-чеков и отправка метрик.

Ответ 18+ 🔞

А, слушай, про таймеры в systemd! Это же, блядь, такая штука, которая cron на бобах обыгрывает, ёпта. Представь себе: cron — это как старый дедок с костылями, который по расписанию бубнит одно и то же, а systemd timer — это уже современный робот-уборщик, который не только пылесосит, но и логи пишет красиво, и если ты проспал — он тебе напомнит. Ебать мои старые костыли, какая разница!

Чем они, сука, круче старого крона:

  • В системе как дома: Всё через systemctl крутишь, логи в journalctl — красота, а не жизнь. Никаких писюлек с crontab -e, где запятую не там поставил — и всё, пизда рулю, задача не работает, а ты и не знаешь почему.
  • Умные зависимости: Можешь заставить задачу стартануть только после того, как нужный диск примонтируется. У крона с этим, конечно, пиздец — он тупо попробует и сольёт в ошибку, если диск не готов.
  • Гибкое расписание: Тут тебе и "каждый будний день", и "раз в неделю", и "через 15 минут после загрузки". Cron, конечно, тоже не дурак, но тут как-то... элегантнее, что ли.
  • Persistent mode — просто песня: Если комп в 2 ночи был выключен, а задача должна была в это время запуститься, то при следующем включении она всё равно выполнится. У крона, понятное дело, доверия ебать ноль — пропустил время, и хуй с горы, считай, день потерян.

Пример: Делаем ежедневный бэкап, чтобы не охуеть потом

  1. Сервис (/etc/systemd/system/backup.service): Тут мы описываем, что делать. Типа, сам скрипт.

    [Unit]
    Description=Database backup job
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/backup-script.sh
    User=backup-user

    Всё просто: запусти разовый скрипт от имени специального юзера. oneshot — значит, запустился, отработал, завершился. Никаких демонов.

  2. Таймер (/etc/systemd/system/backup.timer): А вот это — когда делать. Самое интересное.

    [Unit]
    Description=Run backup daily at 2 AM
    
    [Timer]
    OnCalendar=*-*-* 02:00:00  # Каждый день в 2 ночи. Можно и "Mon..Fri", если только по будням.
    Persistent=true             # Вот эта волшебная фигня! Если проспал — выполнится позже.
    
    [Install]
    WantedBy=timers.target
  3. Запускаем эту банду:

    # Разрешаем таймеру стартовать при загрузке
    sudo systemctl enable backup.timer
    # Запускаем его прямо сейчас (он сам будет спать до 2 ночи)
    sudo systemctl start backup.timer
    # Смотрим, жив ли он и когда следующий пиздёж
    systemctl status backup.timer  # Там будет строчка "Trigger: ..." — следующее срабатывание.
    # А если что-то пошло не так, смотрим логи самого скрипта
    journalctl -u backup.service

Где это в DevOps впаривают? Да везде! Очистка старых логов, чтобы места не жрали овердохуища, синхронизация конфигов между серваками, какие-нибудь периодические проверки здоровья сервисов. В общем, вещь, блядь, must have, а не "надо бы попробовать". Хуй с винтом, что cron проще — тут надёжнее и контролировать удобнее.