Задача и условия
Создадим безопасный пример: служба раз в день записывает сообщение в журнал. Нужна система с systemd и активный пользовательский сеанс. Root не требуется. После проверки вместо echo можно использовать собственный скрипт с абсолютным путём.
Создайте службу
mkdir -p ~/.config/systemd/user
Сохраните в ~/.config/systemd/user/notes-daily.service:
[Unit]
Description=Linux Notes daily reminder
[Service]
Type=oneshot
ExecStart=/usr/bin/echo Review your backups
Служба выполняет одну команду и завершается. Shell автоматически не запускается: конвейеры и перенаправления в ExecStart не работают как в Bash. Для нескольких действий используйте отдельный исполняемый скрипт.
Добавьте расписание
В том же каталоге создайте notes-daily.timer:
[Unit]
Description=Run the Linux Notes reminder daily
[Timer]
OnCalendar=*-*-* 18:00:00
Persistent=true
[Install]
WantedBy=timers.target
По умолчанию таймер активирует одноимённую службу. Время интерпретируется в локальном часовом поясе. Persistent позволяет выполнить пропущенное календарное срабатывание при следующей активации таймера, а не воспроизводит отдельно все пропущенные дни.
Проверьте до включения
systemd-analyze calendar '*-*-* 18:00:00'
systemctl --user daemon-reload
systemctl --user start notes-daily.service
journalctl --user -u notes-daily.service -n 20 --no-pager
Проверьте следующую дату в выводе первой команды и наличие сообщения в журнале. Успешная oneshot-служба без RemainAfterExit становится inactive, это ожидаемо.
Включение и контроль
systemctl --user enable --now notes-daily.timer
systemctl --user list-timers --all
В списке должны появиться следующее и последнее срабатывания. Автозапуск пользовательского менеджера после загрузки без входа зависит от linger. Этот пример рассчитан на сеанс пользователя; для круглосуточных серверных задач отдельно продумайте системную службу или осознанную настройку linger.
Как отключить
systemctl --user disable --now notes-daily.timer
Команда выключает расписание. Она не прерывает уже запущенную службу. После изменения unit-файлов выполните daemon-reload, а после изменения расписания перезапустите таймер.
Основа: управление службами.
Документация: systemd.timer.