Как работает команда at в Linux: особенности, сервисы и настройка

Если вы когда-нибудь задумывались, как в Linux запланировать разовую задачу так, чтобы она выполнилась даже после выхода из системы – команда at станет вашим надёжным помощником. В отличие от cron, который идеален для периодических действий, at работает по принципу «запусти один раз в указанное время». Но как она сохраняет задания, если компьютер перезагрузили или пользователь вышел из сессии? Давайте разбираться без лишней терминологии.

Как команда at сохраняет задания после перезагрузки

Когда вы запускаете at 15:00, система не держит ваш сеанс открытым – вместо этого она создаёт специальный файл-скрипт в директории /var/spool/atjobs. Этот файл содержит:

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

За сохранность и выполнение этих файлов отвечает демон atd (сокращение от «at daemon»). Он работает в фоне и постоянно проверяет папку /var/spool/atjobs. Как только наступает время задачи, atd запускает скрипт от имени пользователя, который его создал – даже если тот уже вышел из системы.

Кстати, посмотреть список активных заданий можно через atq, а для деталей используйте at -c номер_задания (вы увидите, какие переменные и команды сохранены).

Пример:

$ echo "touch /home/user/test.txt" | at now + 5 minutes  
job 5 at Mon Jul 10 15:20:00 2023

Настройка и возможные ошибки

Хотя atd обычно предустановлен в дистрибутивах, иногда его нужно активировать вручную. Например, в Ubuntu/Debian:

sudo systemctl enable --now atd

Если задания не выполняются, проверьте:

  1. Работает ли демон: systemctl status atd (если нет – запустите его).
  2. Права доступа к папке /var/spool/atjobs – они должны быть установлены так, чтобы только владелец и демон могли читать/писать файлы.
  3. Не конфликтует ли at с другими планировщиками вроде cron (это редко, но случается при неправильных настройках).

Важный нюанс: если система перезагрузится до запуска задания, atd проверит время после загрузки и выполнит задачу, как только оно наступит. Но учтите, что задания с меткой «раньше текущего времени» (например, из-за сбоя часового пояса) могут быть пропущены.

Совет: Если вы используете at для задач, требующих графического интерфейса (например, открытия браузера), добавьте экспорт переменной DISPLAY:

echo "export DISPLAY=:0; firefox" | at 09:00

И ещё: хотя at переживает перезагрузки, для периодических задач лучше подойдёт cron – иначе придётся каждый раз заново создавать задание (что, согласитесь, неудобно).

Ошибка, которую часто упускают: если вы удалили файл задания вручную через rm, демон не узнает об этом и попытается его выполнить. Всегда используйте atrm номер_задания или at -d.

Теперь вы знаете, как at сохраняет ваши «напоминалки» даже после перезагрузки и какие подводные камни могут встретиться. Попробуйте создать тестовое задание – например, запланируйте уведомление через notify-send, чтобы убедиться, что всё работает как надо.

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное