Поиск по сайту:

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


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

Как планировать задания Linux

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

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

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

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

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

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

Чтобы установить at в Ubuntu, используйте эту команду:

sudo apt-get install at

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

sudo systemctl enable --now atd.service

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

sudo pacman -Sy at

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

sudo systemctl enable --now atd.service

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

ps -e | grep atd

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

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

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

at
at banana

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

at now + 1 minute

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

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

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

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

sh

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

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

exit

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

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

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

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

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

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

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

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

mail

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

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

at now + 1 minute

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

mail

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

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

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

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

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

  • Run at 11:00 a.m.:
    • at 11:00 AM
    • at 11:00 AM tomorrow
    • at 11:00 AM next week
    • at next week
    • at 11:00 AM next fri
    • at next fri
    • at 11:00 AM next month
    • at 11:00 AM 3/15/2020
    • at now + 30 minutes
    • at now + 2 hours
    • at tomorrow
    • at thursday
    • at midnight
    • at noon
    • at teatime

    Глядя на очередь заданий

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

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

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

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

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

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

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

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

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

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

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

    at now + 5 minutes -f clean.txt

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

    at now + 5 minutes < clean.txt

    Удаление запланированных заданий из очереди

    Чтобы удалить запланированное задание из очереди, вы можете использовать команду atrm. Если вы хотите сначала увидеть очередь, чтобы найти номер задания, которое вы хотите удалить, вы можете использовать atq . Затем используйте этот номер задания с atrm, как показано ниже:

    atq
    atrm 11
    atq

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

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

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

    atq

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

    at -c 13

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

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

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

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

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

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

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

    batch

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

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

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

    Вот как это работает:

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

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

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

    sudo less /etc/at.deny

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

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

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

    sudo gedit /etc/at.allow

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

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

    at

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

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

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

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

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

    RELATED: Best Linux Laptops for Developers and Enthusiasts