# reboot-scheduler `reboot-scheduler` — небольшой `systemd`-сервис на Rust, который раз в запуск планирует перезагрузку в случайную секунду окна **[01:00, 02:00) UTC**, затем запрашивает reboot через `systemctl --no-block reboot`. ## Состав репозитория ```text reboot-scheduler/ ├── src/ │ └── main.rs ├── Cargo.toml ├── Cargo.lock ├── reboot-scheduler.service ├── .gitignore └── README.md ``` ## Требования - Linux x86_64 - `systemd` - Rust toolchain (cargo + rustc) - Поддерживаемые дистрибутивы: Debian 12/13 (и совместимые) ## Сборка ```bash cargo build --release ``` Итоговый бинарь: ```text target/release/reboot-scheduler ``` По умолчанию release-сборка даёт **динамически связанный** glibc-бинарь. Это штатное поведение. ## Установка Команды выполняются от root (или через `sudo`). ```bash mkdir -p /opt/reboot-scheduler cp target/release/reboot-scheduler /opt/reboot-scheduler/reboot-scheduler chmod 755 /opt/reboot-scheduler/reboot-scheduler cp reboot-scheduler.service /etc/systemd/system/reboot-scheduler.service chmod 644 /etc/systemd/system/reboot-scheduler.service systemd-analyze verify /etc/systemd/system/reboot-scheduler.service systemctl daemon-reload systemctl enable --now reboot-scheduler.service ``` ## Поведение сервиса 1. На старте вычисляет целевой timestamp в окне **(01:00, 02:00) UTC**. 2. Ожидает наступления времени, проверяя раз в 30 секунд. 3. Вызывает `systemctl --no-block reboot`. 4. Завершается: - кодом `0`, если reboot-запрос принят; - кодом `1`, если команда завершилась ошибкой или не запустилась. Это важно для корректной работы `Restart=on-failure` в unit-файле. ## Логирование Сервис не пишет в собственные файлы. Логи идут в `journald` (stdout/stderr): ```bash journalctl -u reboot-scheduler -f ``` Формат сообщений: ```text [YYYY-MM-DD HH:MM:SS UTC] Сообщение ``` ## Управление ```bash systemctl status reboot-scheduler systemctl restart reboot-scheduler systemctl stop reboot-scheduler systemctl disable reboot-scheduler ``` ## Проверки качества Рекомендуемый локальный прогон перед релизом: ```bash cargo fmt --check cargo clippy --all-targets --all-features -- -D warnings cargo test --release cargo build --release file target/release/reboot-scheduler ldd target/release/reboot-scheduler ``` ## Удаление ```bash systemctl stop reboot-scheduler systemctl disable reboot-scheduler rm -f /etc/systemd/system/reboot-scheduler.service rm -rf /opt/reboot-scheduler systemctl daemon-reload ```