Как перезапускать службу 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=Restart myservice
[Service]
Type=oneshot
ExecStart=/bin/systemctl restart myserviceПример файла таймера
myservice-restart.timer
[Unit]
Description=Restart myservice every Sunday at 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=Restart $SERVICE_NAME
[Service]
Type=oneshot
ExecStart=/bin/systemctl restart $SERVICE_NAME
EOF
# Создание файла таймера (без встроенных комментариев в OnCalendar!)
cat > "$TIMER_FILE" <<EOF
[Unit]
Description=Restart $SERVICE_NAME every Sunday at 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."If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow