reboot-scheduler
reboot-scheduler — небольшой systemd-сервис на Rust, который раз в запуск планирует перезагрузку в случайную секунду окна [01:00, 02:00) UTC, затем запрашивает reboot через systemctl --no-block reboot.
Состав репозитория
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 (и совместимые)
Сборка
cargo build --release
Итоговый бинарь:
target/release/reboot-scheduler
По умолчанию release-сборка даёт динамически связанный glibc-бинарь. Это штатное поведение.
Установка
Команды выполняются от root (или через sudo).
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
Поведение сервиса
- На старте вычисляет целевой timestamp в окне (01:00, 02:00) UTC.
- Ожидает наступления времени, проверяя раз в 30 секунд.
- Вызывает
systemctl --no-block reboot. - Завершается:
- кодом
0, если reboot-запрос принят; - кодом
1, если команда завершилась ошибкой или не запустилась.
- кодом
Это важно для корректной работы Restart=on-failure в unit-файле.
Логирование
Сервис не пишет в собственные файлы. Логи идут в journald (stdout/stderr):
journalctl -u reboot-scheduler -f
Формат сообщений:
[YYYY-MM-DD HH:MM:SS UTC] Сообщение
Управление
systemctl status reboot-scheduler
systemctl restart reboot-scheduler
systemctl stop reboot-scheduler
systemctl disable reboot-scheduler
Проверки качества
Рекомендуемый локальный прогон перед релизом:
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
Удаление
systemctl stop reboot-scheduler
systemctl disable reboot-scheduler
rm -f /etc/systemd/system/reboot-scheduler.service
rm -rf /opt/reboot-scheduler
systemctl daemon-reload