
В Linux задачи по расписанию решаются несколькими инструментами, но два из них – `at` и `anacron` (часто ошибочно упоминаемый как `amt`) – часто вызывают путаницу. Первый запускает команды однократно в заданное время, второй предназначен для периодических задач на машинах, которые не работают круглосуточно. Разница не только в синтаксисе, но и в архитектуре: `at` полагается на демон `atd`, а `anacron` – на собственную логику обработки расписаний, учитывающую время простоя системы.
`at` идеален для одноразовых задач, например, отложенного удаления файлов или запуска скрипта после перезагрузки. Команда echo "rm -rf /tmp/old_logs" | at 3:00 tomorrow выполнит удаление завтра в 3:00, даже если система была выключена в момент планирования. Однако `at` не учитывает время простоя: если сервер был выключен в запланированное время, задача не выполнится. Для таких случаев нужен `anacron`, который хранит метку последнего запуска и выполнит задачу при первой возможности, если система была недоступна.
`anacron` настраивается через файл /etc/anacrontab, где указываются период (в днях), задержка (в минутах) и команда. Например, строка 7 10 backup.daily /usr/local/bin/backup.sh запустит скрипт раз в 7 дней с задержкой 10 минут после старта системы. В отличие от `cron`, `anacron` не требует точного времени – он ориентируется на интервалы и состояние системы. Это делает его незаменимым для ноутбуков или рабочих станций, которые часто перезагружаются или выключаются.
Выбор между `at` и `anacron` зависит от характера задачи. Для одноразовых действий с точным временем используйте `at`, для периодических – `anacron`, особенно если система не работает 24/7. Оба инструмента дополняют друг друга: `at` не заменяет `anacron`, и наоборот. Проверяйте логи (/var/log/syslog или journalctl -u atd) для отладки, так как ошибки в синтаксисе или отсутствие прав часто остаются незамеченными.
Что делают команды at и atd в Linux и когда их использовать
at – утилита для однократного запуска задач в заданное время. Она принимает команды из стандартного ввода или файла и выполняет их в указанный момент, не требуя постоянного мониторинга. Формат времени гибкий: at 14:30, at now + 1 hour, at midnight. Задачи сохраняются в очереди и обрабатываются демоном atd. После выполнения задание удаляется из системы, в отличие от cron, который работает по расписанию.
Основные сценарии применения at:
- Отложенный запуск скриптов, например, резервного копирования после окончания рабочего дня:
echo "/backup.sh" | at 23:00. - Выполнение одноразовых операций, таких как перезагрузка сервера в нерабочее время:
at 03:00 -f /path/to/reboot_script.sh. - Отправка уведомлений или писем по расписанию без настройки постоянных триггеров.
atd – демон, отвечающий за обработку очереди задач at. Он запускается при старте системы и работает в фоновом режиме, проверяя каждую минуту наличие заданий для выполнения. Без atd команды at не будут работать. Демон использует конфигурационные файлы /etc/at.allow и /etc/at.deny для управления доступом пользователей. Если оба файла отсутствуют, по умолчанию разрешен доступ только суперпользователю.
Когда выбирать at вместо cron:
- Задача должна выполниться один раз –
atавтоматически удаляет задание после выполнения. - Требуется запуск в относительное время (например, через 2 часа), а не по фиксированному расписанию.
- Нужна простота настройки:
atне требует редактирования файлов конфигурации, какcrontab. - Задача зависит от внешних условий (например, завершения другого процесса), которые проще передать через
atс помощью конвейера.
Как настроить однократное выполнение задачи с помощью at
at – утилита для планирования однократного выполнения команд в заданное время. В отличие от cron, который работает по расписанию, at запускает задачу единожды. Утилита доступна в большинстве дистрибутивов Linux, но может требовать установки через пакетный менеджер, например: sudo apt install at (Debian/Ubuntu) или sudo yum install at (RHEL/CentOS). После установки убедитесь, что сервис запущен: sudo systemctl enable --now atd.
Для создания задачи используйте команду at с указанием времени выполнения. Формат времени гибкий: at 14:30 (сегодня в 14:30), at 2:30 PM tomorrow (завтра в 14:30), at now + 1 hour (через час). После ввода команды откроется интерактивный режим, где можно ввести команды для выполнения. Завершите ввод комбинацией Ctrl+D. Пример:
echo "backup.sh" | at 3:00 AM– запуск скрипта в 3:00.at -f /path/to/script.sh 10:00– выполнение скрипта из файла в 10:00.
Для запуска задач с правами другого пользователя используйте sudo в сочетании с -u. Пример: sudo at -u username 15:00. Это полезно для системных задач, требующих повышенных привилегий. Однако будьте осторожны: at не проверяет корректность команд, поэтому ошибки в скриптах могут привести к нежелательным последствиям.
Логи выполнения задач at записываются в системный журнал. Просмотреть их можно с помощью journalctl или grep в /var/log/syslog (Debian) или /var/log/messages (RHEL). Пример поиска: grep "atd" /var/log/syslog. Если задача не выполнилась, проверьте наличие ошибок в логах и убедитесь, что сервис atd активен.
Для автоматизации задач at можно интегрировать с другими инструментами. Например, запуск резервного копирования после завершения длительной операции: long_running_command && echo "backup.sh" | at now + 10 minutes. Также at поддерживает переменные окружения текущей сессии, но не наследует их из родительского процесса. Для передачи переменных используйте export перед созданием задачи или указывайте их непосредственно в команде.
Разбор синтаксиса и ключей команды at для планирования заданий
Команда at в Linux позволяет запускать одноразовые задачи в указанное время. Базовый синтаксис: at [опции] время. Время задаётся в форматах HH:MM, midnight, noon, teatime (16:00) или с указанием даты, например, 2024-05-20 15:30. Для относительных значений используются суффиксы: now + 5 minutes, tomorrow + 2 hours. Без явного указания даты задание выполнится в ближайший подходящий момент текущего дня.
Ключ -f файл позволяет загружать команды из текстового файла вместо интерактивного ввода. Пример: at -f /path/to/script.sh 14:00. Если файл содержит переменные окружения, их нужно экспортировать заранее или указывать в начале файла. Для проверки содержимого задания перед выполнением используйте -c номер_задания, где номер можно узнать через atq.
Задания at выполняются в ограниченном окружении, наследуя только базовые переменные (HOME, LOGNAME, SHELL). Для передачи дополнительных переменных используйте export перед вызовом at или указывайте их в скрипте. Пример: export VAR=value; echo "echo \$VAR" | at now + 1 hour. Обратите внимание на экранирование символа $ при передаче переменных через конвейер.
Для управления очередью заданий используйте atq (просмотр) и atrm номер (удаление). Задания хранятся в каталоге /var/spool/at и выполняются демоном atd. Если задание не запускается, проверьте статус демона: systemctl status atd. Логи можно найти в /var/log/syslog или journalctl -u atd. Задания, запланированные на прошедшее время, выполняются немедленно.
При работе с at учитывайте ограничения безопасности. По умолчанию доступ к команде регулируется файлами /etc/at.allow и /etc/at.deny. Если at.allow существует, только перечисленные в нём пользователи могут использовать at. Если нет – проверяется at.deny. Пустой at.deny разрешает доступ всем. Для повышения безопасности рекомендуется явно указывать разрешения в at.allow.
Как управлять очередью задач atq и удалять задания atrm
Задания at хранятся в каталоге /var/spool/cron/atjobs/ в виде файлов с именами в формате a0000101234567, где цифры – внутренний идентификатор. При удалении через atrm файл перемещается в /var/spool/cron/atspool/ с суффиксом .removed. Если задача не отображается в atq, но файл остался в atjobs, её можно удалить вручную, предварительно остановив демон atd: sudo systemctl stop atd, затем sudo rm /var/spool/cron/atjobs/a* и перезапуск демона.
Для автоматизации управления очередью используйте скрипты с проверкой условий. Например, удаление всех заданий старше 24 часов: atq | awk '$2 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}/ {if (mktime($2" "$3) < systime()-86400) print $1}' | xargs atrm. Этот подход полезен для предотвращения накопления устаревших задач, особенно в системах с частым планированием одноразовых операций. Не забывайте, что atrm не сохраняет удалённые задания – восстановить их можно только из резервных копий каталога /var/spool/cron/.
В каких случаях вместо at применяется команда batch
batch применяется, когда задачи нужно запускать не по фиксированному времени, а при достижении системой определённого уровня нагрузки. В отличие от at, которая выполняет команду в заданный момент, batch ставит задачу в очередь и запускает её только когда средняя загрузка системы опускается ниже порога 0.5 (по умолчанию). Это критично для серверов с нестабильной нагрузкой, где важно избежать конкуренции за ресурсы: например, резервное копирование или обработка больших файлов логично отложить до снижения активности процессора и дисковой подсистемы. Параметр порога можно изменить через /proc/loadavg или настройку atd, но в большинстве случаев значение по умолчанию оптимально.
batch незаменима для пакетной обработки задач, чувствительных к задержкам из-за высокой нагрузки. Если at гарантирует выполнение в точное время, то batch обеспечивает выполнение только при наличии свободных ресурсов, что предотвращает деградацию производительности критичных сервисов. Например, при массовой конвертации медиафайлов или индексации баз данных batch автоматически распределяет нагрузку, избегая пиковых значений, которые могут вызвать отказы смежных процессов. Для принудительного запуска очереди batch без ожидания снижения нагрузки используйте at -q b -f script.sh now, но это нарушает основной принцип работы команды.
Типичные ошибки при работе с at и способы их устранения
Одна из частых ошибок – попытка запустить at без указания времени или с некорректным форматом. Например, команда echo "backup.sh" | at now + 1 hour работает, но at now+1hour вызовет ошибку из-за отсутствия пробела. Решение: всегда разделяйте ключевые слова пробелами (now + 1 hour, 2:30 PM tomorrow). Для проверки синтаксиса используйте at -t с временной меткой в формате [[CC]YY]MMDDhhmm[.ss], например: at -t 202405151430.
Другая проблема – отсутствие прав на выполнение задания. Если скрипт или команда требуют повышенных привилегий, at завершится с ошибкой Permission denied. Способы исправления:
- Запускайте
atот имени пользователя с нужными правами:sudo -u postgres at 3:00 AM. - Проверьте права на файл скрипта:
chmod +x script.sh. - Используйте полные пути к исполняемым файлам в команде, например:
echo "/usr/bin/rsync -av /source /dest" | at midnight.
Ошибка Cannot open /var/spool/at/spool: Permission denied возникает, если пользователь не состоит в группе at или daemon. Решение: добавьте пользователя в группу и перезагрузите сессию:
sudo usermod -aG at $USERилиsudo usermod -aG daemon $USER.- Проверьте группы:
groups. - Перезайдите в систему или выполните
newgrp at.
Если проблема сохраняется, убедитесь, что каталог /var/spool/at имеет права 750 и принадлежит root:at.
Задания at могут не выполняться из-за отсутствия переменных окружения. Например, скрипт, зависящий от $PATH или $HOME, завершится с ошибкой, если эти переменные не определены в контексте atd. Исправление: явно задавайте переменные в команде:
echo "export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; /path/to/script.sh" | at 5:00 AM
Или используйте at -f script.sh, где в начале скрипта определены все необходимые переменные.
Неправильное удаление заданий приводит к их накоплению в очереди. Чтобы удалить задание, сначала получите его номер с помощью atq, затем выполните atrm [номер]. Распространенная ошибка – попытка удалить задание по времени: atrm "now + 1 hour" не сработает. Если atrm не помогает, проверьте процессы atd и при необходимости перезапустите его: sudo systemctl restart atd. Для очистки всех заданий текущего пользователя используйте: atq | cut -f1 | xargs atrm.
Сравнение at с cron: когда выбирать одноразовое выполнение

at и cron решают разные задачи, несмотря на общую область применения – автоматизацию выполнения команд. at запускает задачу однократно в указанное время, после чего она исчезает из очереди. cron, напротив, предназначен для периодического выполнения: ежедневного, еженедельного или по сложному расписанию. Выбор между ними зависит от характера задачи: если требуется выполнить команду один раз – например, перезапустить сервис через 3 часа или отправить отчет после завершения резервного копирования – at подходит идеально.
Основное отличие at от cron заключается в простоте настройки и отсутствии необходимости редактировать конфигурационные файлы. Для запуска задачи через at достаточно команды вида echo "команда" | at 15:30, где время указывается в формате HH:MM, midnight, noon или teatime (16:00). Поддерживаются относительные временные метки: at now + 2 hours. cron требует редактирования файла crontab с указанием расписания в формате * * * * *, что менее интуитивно для одноразовых задач.
Примеры использования at в реальных сценариях:
- Отложенный перезапуск сервера после обновлений:
echo "shutdown -r now" | at 03:00. - Отправка уведомления после завершения длительной операции:
echo "mail -s 'Backup completed' admin@example.com" | at now + 6 hours. - Удаление временных файлов через сутки:
echo "rm -rf /tmp/old_files" | at tomorrow.
В этих случаях cron избыточен, так как задача не требует повторения.
at сохраняет задачи в очереди до их выполнения, что позволяет управлять ими через команды atq (просмотр очереди) и atrm (удаление задачи по ID). Например, atq выведет список задач с их идентификаторами, а atrm 5 удалит задачу с ID 5. cron не предоставляет аналогичного механизма для одноразовых задач – после добавления в crontab задача будет выполняться периодически, пока не будет удалена вручную. Это делает at более гибким инструментом для разовых операций.
Выбирайте at, если:
- Задача должна выполниться один раз в будущем.
- Требуется быстрое создание задачи без редактирования конфигурационных файлов.
- Нужно управлять очередью задач (просмотр, удаление).
cron предпочтителен для регулярных процессов: очистки логов, резервного копирования, проверки состояния системы. Для одноразовых задач at экономит время и снижает риск ошибок при настройке.
