Как использовать 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
показывает
После выполнения задания введите следующее, чтобы проверить внутреннюю почту:
Если нет почты, вы должны предположить успех. Конечно, в этом случае вы можете проверить и посмотреть, не были ли удалены файлы *.bak
, *.tmp
и *.o
. чтобы подтвердить, что команда сработала.
Введите следующее, чтобы запустить все это снова:
at now + 1 minute
Через одну минуту введите следующее, чтобы перепроверить почту:
Эй, у нас есть почта! Чтобы прочитать сообщение номер один, нажмите 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
, но с тремя существенными отличиями:- Команду
batch
можно использовать только в интерактивном режиме. - Вместо планирования выполнения заданий в определенное время вы добавляете их в очередь, и команда
batch
выполняет их, когда средняя загрузка системы ниже 1,5. - Из-за вышеизложенного вы никогда не указываете дату и время с помощью команды
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
.
Linux Commands Files tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc Processes alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap Networking netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld RELATED: Best Linux Laptops for Developers and Enthusiasts
-