at в Linux: как запустить команду один раз по расписанию
В предыдущем материале мы разобрали cron и crontab — инструменты для регулярного запуска задач по расписанию.
Но что делать, если команду нужно выполнить только один раз?
Например:
- выключить сервер через час;
- запустить скрипт сегодня ночью;
- выполнить резервное копирование через 30 минут;
- запустить команду завтра утром;
- выполнить обслуживание системы в конкретное время.
Для таких задач в Linux существует команда:
| |
В этой статье разберём:
- чем
atотличается отcron; - как установить и запустить
atd; - как создать одноразовое задание;
- как использовать относительное и абсолютное время;
- как посмотреть очередь заданий;
- как посмотреть содержимое задания;
- как удалить задание;
- как работают
/etc/at.allowи/etc/at.deny; - почему команда может работать вручную, но не запускаться через
at.
Чем at отличается от cron
Главное различие очень простое.
cron нужен для повторяющихся задач.
Например:
| |
А at используется для одноразового запуска.
Например:
| |
Условно:
| |
Например, cron:
| |
будет запускать скрипт каждый день в 02:00.
А:
| |
позволяет запланировать выполнение один раз.
Установка at
В некоторых дистрибутивах пакет at может быть не установлен по умолчанию.
Debian / Ubuntu
| |
RHEL / Rocky Linux / AlmaLinux / Fedora
В зависимости от системы:
| |
или:
| |
Служба atd
За выполнение заданий at отвечает демон:
| |
Проверить его состояние:
| |
Запустить:
| |
Включить автоматический запуск при загрузке:
| |
Можно сделать сразу обе операции:
| |
После этого система сможет выполнять запланированные через at задания.
Первая задача через at
Попробуем самый простой пример.
Выполним:
| |
После этого появится приглашение:
| |
Теперь вводим команду:
| |
После ввода команды нужно завершить создание задания.
Обычно для этого используется:
| |
Задание будет добавлено в очередь.
Через две минуты можно проверить:
| |
Если появилась строка:
| |
значит всё получилось.
Как указать время выполнения
at умеет понимать достаточно удобные выражения времени.
Например:
| |
Команда будет запланирована на 23:00.
Через 10 минут
| |
Через час
| |
Через два часа
| |
Завтра
В зависимости от реализации можно использовать:
| |
Например:
| |
Запуск скрипта через at
Предположим, у нас есть скрипт:
| |
Сначала проверим его вручную:
| |
Убедимся, что есть права на выполнение:
| |
При необходимости:
| |
Теперь создаём задание:
| |
Вводим:
| |
И завершаем ввод:
| |
Скрипт выполнится один раз в указанное время.
Как добавить команду без интерактивного режима
Необязательно каждый раз заходить в:
| |
Команду можно передать через pipe.
Например:
| |
Это очень удобно для автоматизации.
Ещё пример:
| |
Через минуту должен появиться файл:
| |
Проверить:
| |
Как посмотреть очередь заданий
Для просмотра запланированных заданий используется:
| |
Можно также использовать:
| |
Например:
| |
Здесь:
| |
— номера заданий.
Они пригодятся для просмотра и удаления задач.
Как посмотреть содержимое задания
Предположим, у задания номер:
| |
Посмотреть его содержимое можно командой:
| |
Вы увидите окружение задания и команду, которая должна быть выполнена.
Это полезно при диагностике.
Как удалить задание
Если задача больше не нужна, используется:
| |
Например:
| |
где:
| |
— номер задания.
После этого можно снова выполнить:
| |
и убедиться, что задача исчезла.
atq и atrm
Минимальный набор команд выглядит так:
| |
Ещё полезная команда:
| |
показывает содержимое конкретного задания.
Например:
| |
Практический пример
Создадим скрипт:
| |
Добавим:
| |
Дадим права:
| |
Проверим:
| |
Теперь поставим выполнение через две минуты:
| |
Посмотрим очередь:
| |
Через две минуты проверим результат:
| |
Мы должны увидеть примерно:
| |
Почему лучше использовать абсолютные пути
Как и в случае с cron, окружение задачи at может отличаться от вашей обычной интерактивной shell-сессии.
Поэтому вместо:
| |
лучше использовать:
| |
И вместо:
| |
можно явно указать:
| |
Узнать путь к программе:
| |
Например:
| |
Не забываем про рабочую директорию
Представим, что внутри скрипта используется относительный путь:
| |
При ручном запуске всё работает, потому что вы находитесь в нужной директории.
Но при запуске через at рабочая директория и окружение могут отличаться.
Поэтому надёжнее использовать абсолютные пути:
| |
Или явно переходить в нужную директорию:
| |
Например:
| |
Куда записывать вывод программы
Если скрипт выводит информацию в терминал, при запуске через at вы не будете сидеть перед этим терминалом.
Поэтому результат лучше перенаправлять в файл.
Например:
| |
Здесь:
| |
добавляет стандартный вывод в файл.
А:
| |
отправляет туда же сообщения об ошибках.
После выполнения:
| |
Это существенно упрощает диагностику.
/etc/at.allow и /etc/at.deny
Как и у cron, для at можно ограничить пользователей, которым разрешено создавать задания.
Для этого используются:
| |
и:
| |
at.allow
Файл:
| |
может содержать список пользователей, которым разрешено использовать at.
Например:
| |
at.deny
Файл:
| |
содержит пользователей, которым использование at запрещено.
Например:
| |
Конкретное поведение при отсутствии этих файлов может зависеть от реализации at и политики системы.
Для администратора важно понимать сам механизм:
| |
Эта тема также встречается в LPIC-1.
Если at не работает
Можно пройтись по небольшому чек-листу.
1. Установлен ли пакет at?
| |
2. Работает ли atd?
| |
3. Есть ли задача в очереди?
| |
4. Правильно ли указано время?
Например:
| |
5. Работает ли команда вручную?
| |
6. Есть ли права на выполнение?
| |
При необходимости:
| |
7. Используются ли абсолютные пути?
Надёжнее:
| |
чем:
| |
8. Записываются ли ошибки?
Например:
| |
Команда batch
Вместе с пакетом at можно встретить команду:
| |
Она также ставит задачу в очередь, но предназначена для запуска, когда нагрузка на систему находится на приемлемом уровне.
То есть условно:
| |
а:
| |
Для начинающего администратора batch не настолько важен, как at, atq и atrm, но полезно знать о его существовании.
Cron или at — что выбрать
Теперь можно легко провести границу.
Используем cron
Если задача должна выполняться:
| |
Например:
| |
Используем at
Если задача должна выполниться:
| |
Например:
| |
Простое правило:
cron — регулярно, at — один раз.
Краткая шпаргалка at
Создать задачу
| |
Через 10 минут
| |
Передать команду через pipe
| |
Посмотреть задания
| |
или:
| |
Посмотреть содержимое задания
| |
Удалить задание
| |
Проверить службу
| |
Включить atd
| |
Что важно знать для LPIC-1
В контексте планирования задач стоит знать:
| |
Также важно понимать разницу между:
| |
Это относится к теме автоматизации системных административных задач.
Презентация и видео по теме
➡️Rutube
➡️VK
➡️YouTube
Документация
at(1) — Linux man-pages
Командыat,atq,atrmи основные параметры.atd(8) — Linux man-pages
Документация по демонуatd.LPIC-1 Objectives
Цели сертификации LPIC-1, включая автоматизацию задач и планировщики.