Представь классическую рабочую ситуацию: тебе нужно перезапустить тяжелый веб-сервер Nginx ровно в три часа ночи, чтобы накатить обновление SSL-сертификата во время минимального трафика. Или запустить длительный процесс создания бэкапа базы данных через 45 минут, когда закончится выгрузка квартального отчета.
Как поступает большинство системных администраторов и программистов? Вариантов обычно два, и оба одинаково плохи:
- Запустить в терминале конструкцию вида
sleep 2700 && ./backup.sh &и надеяться, что терминальная сессия не оторвется, SSH-соединение не моргнет, а фоновый процесс не прибьет OOM-killer. - Открыть
crontab -e, судорожно высчитать минуты и часы, записать туда разовую строчку, а на следующее утро мучительно вспоминать, в каком из пяти пользовательских кронтабов остался этот мусор.
Между тем в любой дистрибутив Linux уже несколько десятилетий встроена специализированная системная подсистема для разовых отложенных заданий — утилита at(1) и фоновый системный демон atd.
Чем at принципиально отличается от Cron
Давай разберем фундаментальную разницу в архитектуре планировщиков.
Утилита Cron проектировалась для периодических, повторяющихся задач: выполнять ротацию логов каждое воскресенье в полночь, проверять свободное место на диске каждые 15 минут. Она ничего не знает о контексте пользователя: команды в crontab исполняются с урезанным набором переменных окружения, без привязки к твоей текущей рабочей директории и часто с другой версией оболочки sh.
Утилита at, напротив, создана исключительно для одноразовых запусков. И ее главная суперсила — сохранение полного слепка окружения (Environment Snapshot):
- В момент вызова команды
atутилита делает мгновенный снимок твоих текущих переменных окружения (PATH,USER, локали, кастомные переменные). - Запоминает абсолютный путь к текущей рабочей директории (Current Working Directory).
- Фиксирует значение маски прав доступа к файлам (
umask).
Когда наступает заданное время, системный демон atd просыпается, восстанавливает сохраненное окружение и исполняет команду ровно в том же контексте, в котором ты находился при постановке задачи. Скрипт не упадет из-за потерянного пути к бинарнику или неверной папки!
Человекочитаемый синтаксис времени: от teatime до смещений
Синтаксис указания времени в at — один из самых выразительных и удобных в мире UNIX. Парсер времени понимает десятки естественных конструкций:
# 1. Запуск в точное время сегодня (или завтра, если время уже прошло)
at 03:00
at 11:45 PM
# 2. Относительные смещения от текущего момента
at now + 45 minutes
at now + 3 hours
at now + 2 days
# 3. Исторические англосаксонские алиасы времени
at midnight # Ровно в полночь (00:00)
at noon # Ровно в полдень (12:00)
at teatime # Традиционное время чаепития (ровно 16:00)
# 4. Указание точной календарной даты
at 04:00 2026-11-15
at 10:00 AM tomorrow
Команды можно передавать в at через стандартный ввод (stdin), передавать готовый файл скрипта через ключ -f или работать в интерактивном шелле.
# Перезагрузить веб-сервер ровно в 03:00 ночи через heredoc
at 03:00 << 'EOF'
systemctl restart nginx
echo "Nginx успешно перезапущен" >> /var/log/maintenance.log
EOF
# Запустить тяжелый скрипт очистки через 45 минут
at now + 45 minutes -f /opt/scripts/cleanup-cache.sh
В интерактивном режиме ты вводишь at 23:30, нажимаешь Enter, вводишь произвольное количество команд оболочки и завершаешь ввод комбинацией клавиш Ctrl+D.
Управление очередями, инспекция и удаление задач
Все запланированные задачи регистрируются в системных каталогах /var/spool/at/ или /var/spool/cron/atjobs. Для управления пулом задач используются сопутствующие утилиты atq и atrm:
# Просмотр очереди активных отложенных заданий
atq
# Вывод формата:
# 4 Wed Oct 28 23:30:00 2026 a romach
# 5 Thu Oct 29 03:00:00 2026 a root
# Инспекция содержимого задачи #4 (просмотр сохраненного окружения и тела скрипта)
at -c 4
# Удаление задачи #4 из очереди исполнения
atrm 4
Команда at -c <номер_задачи> крайне полезна для отладки: она выводит полный bash-скрипт, сгенерированный демоном, где видны все экспортированные переменные и исходные команды.
Если тебе интересны тонкости настройки периодических задач, рекомендуем наш смежный разбор: полный гид по Cron и crontab в Linux: от базового расписания до скрытых ловушек окружения, где сопоставляются различные подходы к автоматизации.
Контроль доступа и управление службой atd
Чтобы утилита работала, в системе должен быть запущен фоновый демон atd. Проверить его активность можно стандартной командой:
# Проверка статуса службы
systemctl status atd
# Включение и запуск демона при необходимости
sudo systemctl enable --now atd
Для разграничения прав пользователей администратор может использовать файлы /etc/at.allow и /etc/at.deny. Если файл at.allow существует, право планировать задачи получают только явно перечисленные в нем пользователи.
Используй at для любых разовых регламентных работ: это защитит твои скрипты от внезапных обрывов сети и избавит системный кронтаб от мусорных временных записей.
