112 lines
3.1 KiB
Markdown
112 lines
3.1 KiB
Markdown
# 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
|
|
```
|