Як перезапускати службу SystemD щотижня за допомогою таймерів SystemD
Наступний приклад перезапускає службу щотижня в неділю о 06:00 за допомогою таймерів SystemD.
Найпростіший спосіб використати це — скористатися наведеним нижче скриптом автоустановки, який створює необхідні файли та активує таймер.
Якщо ви хочете створити його вручну, скопіюйте файли .timer та .service до /etc/systemd/system/, перезавантажте systemd за допомогою systemctl daemon-reload і активуйте та запустіть таймер за допомогою systemctl enable --now myservice-restart.timer.
Не забудьте замінити myservice на фактичну назву вашої служби в усіх файлах!
Приклад файлу служби
myservice-restart.service
[Unit]
Description=Перезапустити myservice
[Service]
Type=oneshot
ExecStart=/bin/systemctl restart myserviceПриклад файлу таймера
myservice-restart.timer
[Unit]
Description=Перезапускати myservice щонеділі о 06:00
[Timer]
OnCalendar=Sun *-*-* 06:00:00 # Тут не допускаються вбудовані коментарі!
Persistent=true
[Install]
WantedBy=timers.targetСкрипт автоустановки
install-weekly-autorestart.sh
#!/bin/bash
# TODO Визначте назву служби тут
SERVICE_NAME="myservice"
# Додаткова конфігурація (необов'язкова)
TIMER_NAME="${SERVICE_NAME}-restart"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
TIMER_FILE="/etc/systemd/system/${TIMER_NAME}.timer"
SERVICE_RESTART_FILE="/etc/systemd/system/${TIMER_NAME}.service"
# Перевірка, чи скрипт запущено від імені root
if [ "$(id -u)" -ne 0 ]; then
echo "Помилка: Цей скрипт потрібно запускати від імені root (використовуйте sudo)." >&2
exit 1
fi
# Перевірка, чи існує цільова служба
if [ ! -f "$SERVICE_FILE" ]; then
echo "Помилка: Файл служби '$SERVICE_FILE' не існує. Спочатку створіть його." >&2
exit 1
fi
# Створення файлу служби таймера (oneshot для перезапуску цільової служби)
cat > "$SERVICE_RESTART_FILE" <<EOF
[Unit]
Description=Перезапустити $SERVICE_NAME
[Service]
Type=oneshot
ExecStart=/bin/systemctl restart $SERVICE_NAME
EOF
# Створення файлу таймера (без вбудованих коментарів у OnCalendar!)
cat > "$TIMER_FILE" <<EOF
[Unit]
Description=Перезапускати $SERVICE_NAME щонеділі о 06:00
[Timer]
OnCalendar=Sun *-*-* 06:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
# Перезавантаження systemd, активація та запуск таймера
echo "Перезавантаження systemd..."
systemctl daemon-reload
echo "Активація та запуск таймера..."
systemctl enable --now "$TIMER_NAME.timer"
# Перевірка, чи таймер активний
echo "Перевірка статусу таймера..."
systemctl list-timers --all | grep "$TIMER_NAME"
echo "Установку завершено!"
echo "Служба '$SERVICE_NAME' тепер буде перезапускатися щонеділі о 06:00."Якщо ця стаття допомогла вам, будь ласка, подумайте про те, щоб купити мені каву або зробити пожертву через PayPal на підтримку досліджень та публікації нових статей на TechOverflow