Как использовать at и пакетную обработку в Linux для планирования команд

Если вы хотите запланировать задание Linux, которое будет выполняться только один раз, cron будет излишним. Семейство команд at — это то, что вам нужно! А если вы хотите запускать процессы только тогда, когда в вашей системе есть свободные ресурсы, вы можете использовать пакетную обработку.

Как планировать работу в Linux

Демон cron поддерживает список заданий, которые он запускает в определенное время. Эти задачи и программы запускаются в фоновом режиме в запланированное время. Это дает вам большую гибкость при планировании задач, которые необходимо повторять. Если вам нужно запускать задачу один раз в час, в определенное время каждый день или один раз в месяц или год, вы можете настроить ее в cron.

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

В Linux, если вы боретесь с проблемой, это почти гарантия, что кто-то другой тоже боролся с ней. К счастью, поскольку Unix-подобные операционные системы существуют уже очень давно, есть отличный шанс, что кто-то создал решение вашей проблемы.

Для проблемы, описанной выше, у них есть, и она называется.

Установка команды at

Нам пришлось установить на Ubuntu 18.04 и Manjaro 18.1.0 (он уже был установлен на Fedora 31).

Для установки на Ubuntu используйте эту команду:

sudo apt-get install at

В

После завершения установки вы можете запустить демон at с помощью этой команды:

sudo systemctl enable --now atd.service

В

На Manjaro вы устанавливаете с помощью этой команды:

sudo pacman -Sy at

В

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

sudo systemctl enable --now atd.service

В

В любом дистрибутиве вы можете ввести эту команду, чтобы убедиться, что демон atd запущен:

ps -e | grep atd

В

Как использовать команду at в интерактивном режиме

Чтобы использовать at, вы должны назначить ему дату и время для запуска. Вы можете их писать очень гибко, о чем мы расскажем далее в этой статье.

Однако, даже если мы собираемся использовать at в интерактивном режиме, вы должны заранее указать дату и время. Если вы ничего не включаете в командную строку или вводите что-то, кроме даты и времени, at ответит «искаженное время», как показано ниже:

at
at banana

Неправильное использование

Даты и время могут быть явными или относительными. Например, предположим, что вы хотите, чтобы команда выполнялась через минуту. at знает, что означает «сейчас», поэтому вы можете использовать «сейчас» и добавить к нему одну минуту, например:

at now + 1 minute

В

at распечатывает сообщение и приглашение at и ждет, когда вы наберете команды, которые хотите запланировать. Однако сначала рассмотрим сообщение, как показано ниже:

  Как организовать свои списки в Linux с помощью Dynalist

В

Он сообщает вам при запуске экземпляра оболочки sh и будет запустите команды внутри этого. Ваши команды не будут выполняться в оболочке Bash, которая совместима с оболочкой sh, но имеет более богатый набор функций.

Если ваши команды или сценарии попытаются использовать функцию или средство, предоставляемое Bash, но sh этого не сделает, они потерпят неудачу.

Легко проверить, будут ли ваши команды или сценарии выполняться в sh. Используйте команду sh для запуска оболочки sh:

sh

В

Командная строка изменится на знак доллара ($), и теперь вы можете запустить свои команды и убедиться, что они работают правильно.

Чтобы вернуться в оболочку Bash, введите команду выхода:

exit

Вы не увидите стандартного вывода или сообщений об ошибках от команд. Это связано с тем, что оболочка sh запускается как фоновая задача и работает без какого-либо экранного интерфейса.

Любой вывод команд — хороший или плохой — отправляется вам по электронной почте. Он отправляется через внутреннюю почтовую систему тому, кто выполняет команду at. Это означает, что вам необходимо установить и настроить эту внутреннюю систему электронной почты.

Многие (большинство) систем Linux не имеют внутренней системы электронной почты, поскольку она редко требуется. Те, которые обычно используют такую ​​систему, как Отправить письмо или же постфикс. Если ваша система не имеет внутренней системы электронной почты, вы можете использовать сценарии для записи в файлы или перенаправления вывода в файлы для добавления ведения журнала.

Если команда не генерирует стандартный вывод или сообщения об ошибках, вы все равно не получите электронное письмо. Многие команды Linux указывают на успех через тишину, поэтому в большинстве случаев вы не получите электронное письмо.

Теперь пришло время ввести команду в. В этом примере мы будем использовать небольшой файл сценария под названием sweep.sh, который удаляет файлы * .bak, * .tmp и * .o. Введите путь к команде, как показано ниже, и нажмите Enter.

В

Появится еще одна командная строка, и вы можете добавить столько команд, сколько захотите. Обычно удобнее иметь ваши команды в одном скрипте и просто вызывать этот скрипт изнутри по адресу.

Нажмите Ctrl + D, чтобы сказать, что вы закончили добавлять команды. на выставках , что значит конец передачи. Вам сообщают номер задания и время его запуска, как показано ниже:

Подтверждение

После выполнения задания введите следующее, чтобы проверить внутреннюю почту:

mail

В

Если нет почты, можно считать успехом. Конечно, в этом случае вы можете проверить, были ли удалены файлы * .bak, * .tmp и * .o, чтобы убедиться, что команда сработала.

Введите следующее, чтобы снова запустить все это:

at now + 1 minute

В

Через минуту введите следующее, чтобы перепроверить почту:

mail

В

Привет, у нас есть почта! Чтобы прочитать сообщение номер один, нажмите 1, а затем нажмите Enter.

Внутренний адрес электронной почты в окне терминала.

Мы получили электронное письмо от at, поскольку команды в скрипте генерировали сообщения об ошибках. В этом примере не было файлов для удаления, потому что, когда мы ранее запускали сценарий, он удалил их.

Нажмите D + Enter, чтобы удалить электронную почту, и Q + Enter, чтобы выйти из почтовой программы.

Форматы даты и времени

Когда дело доходит до форматов времени, которые можно использовать в at, у вас есть большая гибкость. Вот несколько примеров:

  Как выключить компьютер с Linux, который не выключается

Запуск в 11:00:

at 11:00 AM

Беги завтра в 11:00:

at 11:00 AM tomorrow

Запуск в 11:00 в этот день на следующей неделе:

at 11:00 AM next week

Запускать в это время, в этот день, на следующей неделе:

at next week

Запуск в 11:00 в следующую пятницу:

at 11:00 AM next fri

Запускать в это время в следующую пятницу:

at next fri

Запуск в 11:00 этого числа следующего месяца:

at 11:00 AM next month

Запуск в 11:00 в определенный день:

at 11:00 AM 3/15/2020

Выполнить через 30 минут:

at now + 30 minutes

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

at now + 2 hours

Беги завтра в это время:

at tomorrow

Запуск в это время в четверг:

at thursday

Запуск в 12:00:

at midnight

Запуск в 12:00:

at noon

Если вы британец, вы даже можете запланировать выполнение команды во время чаепития (16:00):

at teatime

Просмотр очереди заданий

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

Выход из

Для каждой команды в очереди atq отображает следующую информацию:

ID вакансии
Запланированная дата
Запланированное время
Очередь, в которой находится задание. Очереди помечены буквами «a», «b» и так далее. Обычные задачи, которые вы планируете использовать, помещаются в очередь «a», а задачи, которые вы планируете с помощью пакетной обработки (рассмотренные далее в этой статье), помещаются в очередь «b».
Человек, который запланировал работу.

Использование at в командной строке

Вам не нужно использовать at в интерактивном режиме; вы также можете использовать его в команде. Это упрощает использование внутри скриптов.

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

echo "sh ~/sweep.sh" | at 08:45 AM

An

Задание принято и запланировано пользователем в, а номер задания и дата выполнения сообщаются так же, как и раньше.

Использование at с файлами команд

Вы также можете сохранить последовательность команд в файле, а затем передать ее в at. Это может быть обычный текстовый файл команд — это не обязательно должен быть исполняемый сценарий.

Вы можете использовать параметр -f (файл) следующим образом, чтобы передать имя файла в at:

at now + 5 minutes -f clean.txt

An

Вы можете добиться того же результата, если перенаправите файл по адресу:

at now + 5 minutes 

An

Removing Scheduled Jobs from the Queue

To remove a scheduled job from the queue, you can use the atrm command. If you want to see the queue first to find the number of the job you want to remove, you can use atq . Then, use that job number with atrm, as shown below:

atq
atrm 11
atq

Удаление задания 11 из очереди at в окне терминала.

Как увидеть подробный обзор вакансий

Как мы упоминали ранее, вы можете планировать задания на далекое будущее. Иногда вы можете забыть, что будет делать работа. Команда atq показывает вам задания в очереди, но не то, что они собираются делать. Если вы хотите увидеть подробный обзор задания, вы можете использовать параметр -c (cat).

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

atq

Выход из

Теперь мы будем использовать задание номер 13 с параметром -c:

at -c 13

В

Вот разбивка информации, которую мы получаем о работе:

Первая строка: это говорит нам, что команды будут выполняться под оболочкой sh.
Вторая строка: мы видим, что команды будут выполняться с идентификатором пользователя и группы 1000. Это значения для человека, который запустил команду at.
Третья строка: человек, который получает письма по электронной почте.
Четвертая строка: Маска пользователя равно 22. Это маска, используемая для установки разрешений по умолчанию для любых файлов, созданных в этом сеансе sh. Маска вычитается из 666, что дает нам 644 (восьмеричный эквивалент rw-r - r--).
Остальные данные: большинство из них - переменные среды.

Выход из

Результаты теста. Тест проверяет, доступен ли каталог выполнения. Если это не удается, возникает ошибка, и выполнение задания прекращается.
Команды, которые нужно выполнить. Они перечислены, и отображается содержимое запланированных сценариев. Обратите внимание, что хотя сценарий в нашем примере выше был написан для работы под Bash, он все равно будет выполняться в оболочке sh.

Пакетная команда

Пакетная команда действует аналогично к команде at, но с тремя существенными отличиями:

Вы можете использовать пакетную команду только в интерактивном режиме.
Вместо того, чтобы планировать выполнение заданий в определенное время, вы добавляете их в очередь, а пакетная команда выполняет их, когда средняя загрузка системы ниже 1,5.
Из-за вышесказанного вы никогда не указываете дату и время с помощью пакетной команды.

Когда вы используете пакетную команду, вы вызываете ее по имени без параметров командной строки, например:

batch

В

Затем добавьте задачи так же, как с командой at.

Управление доступом к команде at

Файлы at.allow и at.deny определяют, кто может использовать семейство команд at. Они находятся в каталоге / etc. По умолчанию существует только файл at.deny, и он создается при установке at.

Вот как они работают:

at.deny: перечисляет приложения и объекты, которые нельзя использовать для планирования заданий.
at.allow: списки, которые могут использовать at для планирования заданий. Если файл at.allow не существует, at использует только файл at.deny.

По умолчанию любой может использовать at. Если вы хотите ограничить круг лиц, которые могут его использовать, используйте файл at.allow, чтобы перечислить тех, кто может. Это проще, чем добавлять всех, кто не может использовать at, в файл at.deny.

Вот как выглядит файл at.deny:

sudo less /etc/at.deny

В

В этом файле перечислены компоненты операционной системы, которые нельзя использовать в. Многие из них не могут сделать это по соображениям безопасности, поэтому вы не хотите удалять их из файла.

Содержимое файла at.deny в окне терминала.

Теперь мы отредактируем файл at.allow. Мы собираемся добавить Дэйва и Мэри, но никому больше не будет разрешено использовать в.

Сначала мы набираем следующее:

sudo gedit /etc/at.allow

В

В редакторе мы добавляем два имени, как показано ниже, а затем сохраняем файл.

Если кто-то еще попытается использовать at, ему скажут, что у него нет разрешения. Например, предположим, что пользователь по имени Эрик вводит следующее:

at

Ему будет отказано, как показано ниже.

Опять же, Эрика нет в файле at.deny. Как только вы помещаете кого-либо в файл at.allow, никому и всем остальным будет отказано в разрешении на использование at.

Отлично подходит для одноразовых

Как видите, как at, так и batch идеально подходят для задач, которые нужно выполнить только один раз. Опять же, в качестве быстрого обзора:

Если вам нужно сделать что-то необычное, запланируйте это на.
Если вы хотите запускать задачу только при достаточно низкой загрузке системы, используйте пакетную обработку.