at в Linux: как запустить команду один раз по расписанию

at в Linux: как запустить команду один раз по расписанию

at в Linux: как запустить команду один раз по расписанию

В предыдущем материале мы разобрали cron и crontab — инструменты для регулярного запуска задач по расписанию.

Но что делать, если команду нужно выполнить только один раз?

Например:

  • выключить сервер через час;
  • запустить скрипт сегодня ночью;
  • выполнить резервное копирование через 30 минут;
  • запустить команду завтра утром;
  • выполнить обслуживание системы в конкретное время.

Для таких задач в Linux существует команда:

1
at

В этой статье разберём:

  • чем at отличается от cron;
  • как установить и запустить atd;
  • как создать одноразовое задание;
  • как использовать относительное и абсолютное время;
  • как посмотреть очередь заданий;
  • как посмотреть содержимое задания;
  • как удалить задание;
  • как работают /etc/at.allow и /etc/at.deny;
  • почему команда может работать вручную, но не запускаться через at.

Чем at отличается от cron

Главное различие очень простое.

cron нужен для повторяющихся задач.

Например:

1
2
3
4
каждый день в 02:00
каждые 5 минут
каждый понедельник
раз в неделю

А at используется для одноразового запуска.

Например:

1
2
3
4
через 10 минут
сегодня в 23:00
завтра утром
один раз ночью

Условно:

1
2
3
cron → повторяющиеся задачи

at   → одноразовая задача

Например, cron:

1
0 2 * * * /home/user/backup.sh

будет запускать скрипт каждый день в 02:00.

А:

1
at 02:00

позволяет запланировать выполнение один раз.


Установка at

В некоторых дистрибутивах пакет at может быть не установлен по умолчанию.

Debian / Ubuntu

1
sudo apt install at

RHEL / Rocky Linux / AlmaLinux / Fedora

В зависимости от системы:

1
sudo dnf install at

или:

1
sudo yum install at

Служба atd

За выполнение заданий at отвечает демон:

1
atd

Проверить его состояние:

1
systemctl status atd

Запустить:

1
sudo systemctl start atd

Включить автоматический запуск при загрузке:

1
sudo systemctl enable atd

Можно сделать сразу обе операции:

1
sudo systemctl enable --now atd

После этого система сможет выполнять запланированные через at задания.


Первая задача через at

Попробуем самый простой пример.

Выполним:

1
at now + 2 minutes

После этого появится приглашение:

1
at>

Теперь вводим команду:

1
echo "at работает" >> /home/user/at-test.log

После ввода команды нужно завершить создание задания.

Обычно для этого используется:

1
Ctrl+D

Задание будет добавлено в очередь.

Через две минуты можно проверить:

1
cat /home/user/at-test.log

Если появилась строка:

1
at работает

значит всё получилось.


Как указать время выполнения

at умеет понимать достаточно удобные выражения времени.

Например:

1
at 23:00

Команда будет запланирована на 23:00.


Через 10 минут

1
at now + 10 minutes

Через час

1
at now + 1 hour

Через два часа

1
at now + 2 hours

Завтра

В зависимости от реализации можно использовать:

1
at 10:00 tomorrow

Например:

1
at 09:30 tomorrow

Запуск скрипта через at

Предположим, у нас есть скрипт:

1
/home/user/backup.sh

Сначала проверим его вручную:

1
/home/user/backup.sh

Убедимся, что есть права на выполнение:

1
ls -l /home/user/backup.sh

При необходимости:

1
chmod +x /home/user/backup.sh

Теперь создаём задание:

1
at 23:00

Вводим:

1
/home/user/backup.sh

И завершаем ввод:

1
Ctrl+D

Скрипт выполнится один раз в указанное время.


Как добавить команду без интерактивного режима

Необязательно каждый раз заходить в:

1
at>

Команду можно передать через pipe.

Например:

1
echo "/home/user/backup.sh" | at now + 10 minutes

Это очень удобно для автоматизации.

Ещё пример:

1
echo "touch /tmp/at-test" | at now + 1 minute

Через минуту должен появиться файл:

1
/tmp/at-test

Проверить:

1
ls -l /tmp/at-test

Как посмотреть очередь заданий

Для просмотра запланированных заданий используется:

1
atq

Можно также использовать:

1
at -l

Например:

1
2
3    Mon Oct 26 23:00:00 2026 a user
4    Mon Oct 26 23:30:00 2026 a user

Здесь:

1
2
3
4

— номера заданий.

Они пригодятся для просмотра и удаления задач.


Как посмотреть содержимое задания

Предположим, у задания номер:

1
3

Посмотреть его содержимое можно командой:

1
at -c 3

Вы увидите окружение задания и команду, которая должна быть выполнена.

Это полезно при диагностике.


Как удалить задание

Если задача больше не нужна, используется:

1
atrm

Например:

1
atrm 3

где:

1
3

— номер задания.

После этого можно снова выполнить:

1
atq

и убедиться, что задача исчезла.


atq и atrm

Минимальный набор команд выглядит так:

1
2
3
at      → создать задание
atq     → посмотреть задания
atrm    → удалить задание

Ещё полезная команда:

1
at -c JOB_ID

показывает содержимое конкретного задания.

Например:

1
at -c 5

Практический пример

Создадим скрипт:

1
nano /home/user/at-test.sh

Добавим:

1
2
3
#!/bin/bash

echo "Задание выполнено: $(date)" >> /home/user/at-result.log

Дадим права:

1
chmod +x /home/user/at-test.sh

Проверим:

1
/home/user/at-test.sh

Теперь поставим выполнение через две минуты:

1
echo "/home/user/at-test.sh" | at now + 2 minutes

Посмотрим очередь:

1
atq

Через две минуты проверим результат:

1
cat /home/user/at-result.log

Мы должны увидеть примерно:

1
Задание выполнено: Mon Oct 26 20:45:00 CET 2026

Почему лучше использовать абсолютные пути

Как и в случае с cron, окружение задачи at может отличаться от вашей обычной интерактивной shell-сессии.

Поэтому вместо:

1
backup.sh

лучше использовать:

1
/home/user/scripts/backup.sh

И вместо:

1
python3 script.py

можно явно указать:

1
/usr/bin/python3 /home/user/scripts/script.py

Узнать путь к программе:

1
which python3

Например:

1
/usr/bin/python3

Не забываем про рабочую директорию

Представим, что внутри скрипта используется относительный путь:

1
./config.txt

При ручном запуске всё работает, потому что вы находитесь в нужной директории.

Но при запуске через at рабочая директория и окружение могут отличаться.

Поэтому надёжнее использовать абсолютные пути:

1
/home/user/project/config.txt

Или явно переходить в нужную директорию:

1
cd /home/user/project && ./backup.sh

Например:

1
echo "cd /home/user/project && ./backup.sh" | at 23:00

Куда записывать вывод программы

Если скрипт выводит информацию в терминал, при запуске через at вы не будете сидеть перед этим терминалом.

Поэтому результат лучше перенаправлять в файл.

Например:

1
echo "/home/user/script.sh >> /home/user/at.log 2>&1" | at now + 5 minutes

Здесь:

1
>> /home/user/at.log

добавляет стандартный вывод в файл.

А:

1
2>&1

отправляет туда же сообщения об ошибках.

После выполнения:

1
cat /home/user/at.log

Это существенно упрощает диагностику.


/etc/at.allow и /etc/at.deny

Как и у cron, для at можно ограничить пользователей, которым разрешено создавать задания.

Для этого используются:

1
/etc/at.allow

и:

1
/etc/at.deny

at.allow

Файл:

1
/etc/at.allow

может содержать список пользователей, которым разрешено использовать at.

Например:

1
2
3
admin
sergey
devops

at.deny

Файл:

1
/etc/at.deny

содержит пользователей, которым использование at запрещено.

Например:

1
2
guest
student

Конкретное поведение при отсутствии этих файлов может зависеть от реализации at и политики системы.

Для администратора важно понимать сам механизм:

1
2
3
at.allow → разрешение

at.deny  → запрет

Эта тема также встречается в LPIC-1.


Если at не работает

Можно пройтись по небольшому чек-листу.

1. Установлен ли пакет at?

1
which at

2. Работает ли atd?

1
systemctl status atd

3. Есть ли задача в очереди?

1
atq

4. Правильно ли указано время?

Например:

1
at now + 2 minutes

5. Работает ли команда вручную?

1
/home/user/script.sh

6. Есть ли права на выполнение?

1
ls -l /home/user/script.sh

При необходимости:

1
chmod +x /home/user/script.sh

7. Используются ли абсолютные пути?

Надёжнее:

1
/home/user/scripts/backup.sh

чем:

1
backup.sh

8. Записываются ли ошибки?

Например:

1
echo "/home/user/script.sh >> /home/user/at.log 2>&1" | at now + 2 minutes

Команда batch

Вместе с пакетом at можно встретить команду:

1
batch

Она также ставит задачу в очередь, но предназначена для запуска, когда нагрузка на систему находится на приемлемом уровне.

То есть условно:

1
2
3
at
↓
выполни в указанное время

а:

1
2
3
batch
↓
выполни, когда система будет достаточно свободна

Для начинающего администратора batch не настолько важен, как at, atq и atrm, но полезно знать о его существовании.


Cron или at — что выбрать

Теперь можно легко провести границу.

Используем cron

Если задача должна выполняться:

1
2
3
4
каждый день
каждый час
каждую неделю
каждые 5 минут

Например:

1
0 2 * * * /home/user/backup.sh

Используем at

Если задача должна выполниться:

1
2
3
один раз через 10 минут
один раз сегодня ночью
один раз завтра утром

Например:

1
echo "/home/user/backup.sh" | at 23:00

Простое правило:

cron — регулярно, at — один раз.


Краткая шпаргалка at

Создать задачу

1
at 23:00

Через 10 минут

1
at now + 10 minutes

Передать команду через pipe

1
echo "/home/user/script.sh" | at now + 5 minutes

Посмотреть задания

1
atq

или:

1
at -l

Посмотреть содержимое задания

1
at -c 3

Удалить задание

1
atrm 3

Проверить службу

1
systemctl status atd

Включить atd

1
sudo systemctl enable --now atd

Что важно знать для LPIC-1

В контексте планирования задач стоит знать:

1
2
3
4
5
6
at
atq
atrm
atd
/etc/at.allow
/etc/at.deny

Также важно понимать разницу между:

1
2
cron → регулярные задания
at   → одноразовые задания

Это относится к теме автоматизации системных административных задач.


Презентация и видео по теме

Скачать презентацию

➡️Rutube

➡️VK

➡️YouTube


Документация

Авторский пост защищен лицензией CC BY 4.0.

Популярные теги