Таймер — юнит systemd с расширением .timer. Сам он ничего не
выполняет: в назначенное время он запускает службу, по умолчанию одноимённую
(clean.timer → clean.service). Поэтому задача — это пара файлов в
/etc/systemd/system: служба описывает, что делать, таймер — когда.
[Unit]
Description=Cleanup old exports
[Service]
Type=oneshot
ExecStart=/usr/local/bin/clean.sh
[Unit]
Description=Run cleanup daily
[Timer]
OnCalendar=*-*-* 03:30
Persistent=true
[Install]
WantedBy=timers.target
Type=oneshot — служба, которая выполняет команду и завершается; пока скрипт
работает, она в состоянии activating. Включают таймер: у службы нет секции
[Install], и systemctl enable clean.service выдаст только длинное
предупреждение. Включённый таймер виден в списке со временем следующего запуска:
student@ubuntu:~$ systemctl list-timers clean.timer --no-pager
NEXT LEFT LAST PASSED UNIT ACTIVATES
Wed 2026-10-21 03:30:00 UTC 17h - - clean.timer clean.service
|
cron |
таймер systemd |
| вывод задачи |
почта или пропадает |
журнал службы, journalctl -u |
| машина была выключена |
запуск пропущен |
Persistent=true — выполнит после старта |
| прошлый запуск ещё идёт |
стартует второй |
тот же юнит второй раз не стартует |
| запустить вне расписания |
скопировать команду в терминал |
systemctl start в тех же условиях |
Расписание OnCalendar
Полная форма — ДеньНедели Год-Месяц-День Час:Минута:Секунда. Любая часть
может быть *, списком через запятую, диапазоном через .. или шагом через /.
| Запись |
Когда |
hourly |
каждый час, в :00 |
daily |
каждый день в 00:00 |
weekly |
по понедельникам в 00:00 |
*-*-* 03:30 |
каждый день в 03:30 |
Mon..Fri 03:00 |
по будням в 03:00 |
Sat,Sun 10:00 |
по выходным в 10:00 |
*-*-01 04:00 |
первого числа каждого месяца |
*:0/15 |
каждые 15 минут |
03:00 Europe/Moscow |
в 03:00 по московскому времени |
Без пояса время считается по часам машины (timedatectl). Запись проверяет
systemd-analyze calendar — она показывает и ближайший запуск:
student@ubuntu:~$ systemd-analyze calendar 'Mon..Fri 03:00'
Original form: Mon..Fri 03:00
Normalized form: Mon..Fri *-*-* 03:00:00
Next elapse: Wed 2026-10-21 03:00:00 UTC
From now: 16h left
Кроме календаря таймер умеет считать от событий: OnBootSec=5min — через пять
минут после загрузки, OnUnitActiveSec=1h — через час после прошлого запуска
службы.
Окружение службы
Служба стартует вне твоего терминала, и окружение у неё своё:
student@ubuntu:~$ sudo systemd-run --pipe --wait --quiet \
sh -c 'echo "PATH=$PATH"; echo "HOME=$HOME"; pwd; id -un'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
HOME=
/
root
- текущий каталог —
/: относительный путь в скрипте считается от корня;
свой каталог задаёт WorkingDirectory=;
PATH короткий: ~/bin и добавки из ~/.bashrc в нём нет;
- переменных из
~/.bashrc и из строк crontab нет — их задают
Environment=ИМЯ=значение или EnvironmentFile=;
- пользователь — root,
HOME пуст; с User=student служба идёт от student и
получает HOME=/home/student;
~/.profile и ~/.bashrc не читаются, umask — 0022.
Журнал
Всё, что скрипт печатает в stdout и stderr, попадает в журнал
службы. Ключ -o cat убирает из строк время, имя машины и clean.sh[PID]:
student@ubuntu:~$ sudo journalctl -u clean.service -o cat
Starting clean.service - Cleanup old exports...
cleanup started
clean.service: Deactivated successfully.
Finished clean.service - Cleanup old exports.