Дайджесты новостей
Кинематографичный ночной репортажный кадр системного администратора у терминала Linux с запланированной разовой задачей утилиты at.

Одноразовые задачи в Linux: полное руководство по утилите at и демону atd

Представь классическую рабочую ситуацию: тебе нужно перезапустить тяжелый веб-сервер Nginx ровно в три часа ночи, чтобы накатить обновление SSL-сертификата во время минимального трафика. Или запустить длительный процесс создания бэкапа базы данных через 45 минут, когда закончится выгрузка квартального отчета.

Как поступает большинство системных администраторов и программистов? Вариантов обычно два, и оба одинаково плохи:

  1. Запустить в терминале конструкцию вида sleep 2700 && ./backup.sh & и надеяться, что терминальная сессия не оторвется, SSH-соединение не моргнет, а фоновый процесс не прибьет OOM-killer.
  2. Открыть 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 для любых разовых регламентных работ: это защитит твои скрипты от внезапных обрывов сети и избавит системный кронтаб от мусорных временных записей.