SYSTEMD_TIMER_CONFIG
Linux / DevOps
Настройка таймеров systemd (systemd.timer) и user-сессий вместо cron
- Ограничения классического cron: отсутствие гранулярных зависимостей, журналирования в journalctl и гибкого контроля ресурсов (cgroups).
- Необходимость выполнения периодических фоновых задач для непривилегированных пользователей без привилегий root.
- Остановка фоновых user-сервисов после выхода пользователя из SSH-сессии.
1. Включение постоянных user-сессий (Linger Mode)
Разрешает запуск пользовательских таймеров и служб без активной SSH-сессии:
loginctl enable-linger deploy_user
loginctl show-user deploy_user | grep Linger2. Создание исполнительного сервиса /etc/systemd/system/backup.service
[Unit]
Description=Production Database Backup
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
User=deploy_user
ExecStart=/usr/local/bin/backup_script.sh
StandardOutput=journal
StandardError=journal3. Создание управляющего таймера /etc/systemd/system/backup.timer
[Unit]
Description=Run Database Backup daily at 02:30
Requires=backup.service
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target4. Активация и управление таймерами
systemctl daemon-reload
systemctl enable --now backup.timer
# Просмотр расписания всех активных таймеров в системе
systemctl list-timers --all
Практический опыт инженера:
Параметр RandomizedDelaySec=300 распределяет запуск задач в пределах заданного интервала, предотвращая так называемый Thundering Herd эффект (одновременный всплеск I/O и CPU от десятков cron-скриптов в 00:00).
Частые вопросы (FAQ)
Что означает директива Persistent=true в systemd.timer?
Если сервер был выключен в момент запланированного старта таймера, systemd немедленно выполнит пропущенную задачу сразу после следующей загрузки системы.
Как проверить синтаксис расписания OnCalendar?
Используйте утилиту systemd-analyze: systemd-analyze calendar 'Mon,Fri *-*-* 04:00:00'.