Якщо ви хочете запланувати завдання Linux, яке буде виконуватися лише один раз, cron — це зайве. Сімейство команд – це те, що вам потрібно! І якщо ви хочете запускати процеси лише тоді, коли ваша система має вільні ресурси, ви можете використовувати пакетний режим.
Як запланувати роботу Linux
Демон cron підтримує список завдань, які він виконує в певний час. Ці завдання та програми виконуються у фоновому режимі в запланований час. Це забезпечує велику гнучкість для планування завдань, які потрібно повторити. Незалежно від того, чи потрібно вам виконувати завдання раз на годину, в певний час кожного дня, раз на місяць чи рік, ви можете налаштувати його в cron.
Однак це не допоможе, якщо ви хочете запланувати виконання завдання лише один раз. Звичайно, ви можете налаштувати його в cron, але тоді ви повинні не забути повернутися і видалити файл запис crontab після виконання завдання, що незручно.
З Linux, якщо ви боретеся з проблемою, це майже гарантія, що хтось інший теж стикався з нею. На щастя, оскільки Unix-подібні операційні системи існують так давно, є також чудовий шанс, що хтось створив рішення для вашої проблеми.
Для проблеми, описаної вище, у них є, і вона називається.
Встановлення at Command
Нам довелося встановити at на Ubuntu 18.04 і Manjaro 18.1.0 (вона вже була встановлена на Fedora 31).
Щоб встановити на 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 banana
Дати та час можуть бути явними або відносними. Наприклад, припустимо, що ви хочете, щоб команда виконувалася через одну хвилину. at знає, що означає “зараз”, тому ви можете використовувати зараз і додати до нього одну хвилину, наприклад:
at now + 1 minute
at друкує повідомлення та підказку at і чекає, поки ви введете команди, які потрібно запланувати. Однак спочатку розгляньте повідомлення, як показано нижче:
Він повідомляє вам під час запуску екземпляра оболонки sh і буде запустіть команди всередині нього. Ваші команди не виконуватимуться в оболонці Bash, яка сумісна з оболонкою sh, але має більш багатий набір функцій.
Якщо ваші команди або сценарії намагаються використати функцію або засіб, які надає Bash, але sh цього не робить, вони зазнають невдачі.
Легко перевірити, чи виконуватимуться ваші команди чи сценарії в sh. Використовуйте команду sh, щоб запустити оболонку sh:
sh
Командний рядок змінюється на знак долара ($), і тепер ви можете запустити свої команди та перевірити, чи вони працюють правильно.
Щоб повернутися до оболонки Bash, введіть команду exit:
exit
Ви не побачите жодного стандартного виводу чи повідомлень про помилки від команд. Це тому, що оболонка sh запускається як фонове завдання і працює без будь-якого екранного інтерфейсу.
Будь-який результат команд — хороший чи поганий — надсилається вам електронною поштою. Він надсилається через внутрішню поштову систему тому, хто виконує команду at. Це означає, що вам потрібно налаштувати та налаштувати внутрішню систему електронної пошти.
Багато (більшість) систем Linux не мають внутрішньої системи електронної пошти, оскільки вона рідко потрібна. Ті, які зазвичай використовують таку систему, як sendmail або постфікс. Якщо у вашій системі немає внутрішньої системи електронної пошти, ви можете налаштувати запис сценаріїв у файли або переспрямувати вихід у файли, щоб додати журнал.
Якщо команда не генерує жодного стандартного виводу чи повідомлень про помилки, ви все одно не отримаєте електронного листа. Багато команд Linux вказують на успіх через мовчання, тому в більшості випадків ви не отримаєте електронного листа.
Тепер настав час ввести команду at. Для цього прикладу ми використаємо невеликий файл сценарію під назвою sweep.sh, який видаляє файли *.bak, *.tmp і *.o. Введіть шлях до команди, як показано нижче, а потім натисніть Enter.
З’явиться інший командний рядок, і ви можете додати скільки завгодно команд. Зазвичай зручніше мати команди в одному сценарії і просто викликати цей сценарій зсередини на.
Натисніть Ctrl+D, щоб повідомити, що ви закінчили додавати команди. на виставках
Після виконання завдання введіть наступне, щоб перевірити внутрішню пошту:
Якщо немає пошти, ви повинні припустити успіх. Звичайно, у цьому випадку ви можете перевірити, чи були видалені файли *.bak, *.tmp і *.o, щоб підтвердити, що команда спрацювала.
Введіть наступне, щоб запустити все знову:
at now + 1 minute
Через одну хвилину введіть наступне, щоб повторно перевірити свою пошту:
Гей, у нас є пошта! Щоб прочитати повідомлення номер один, натисніть 1, а потім натисніть Enter.
Ми отримали електронний лист від at, оскільки команди в сценарії створили повідомлення про помилки. У цьому прикладі не було файлів для видалення, тому що, коли ми запустили сценарій раніше, він видалив їх.
Натисніть D+Enter, щоб видалити електронний лист, і Q+Enter, щоб вийти з програми електронної пошти.
Формати дати та часу
Ви маєте велику гнучкість, коли справа доходить до форматів часу, які ви можете використовувати. Ось кілька прикладів:
Запуск об 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 відображає таку інформацію:
Ідентифікатор роботи
Запланована дата
Запланований час
Поставте в чергу завдання. Черги позначаються «a», «b» тощо. Звичайні завдання, які ви плануєте на , переходять до черги «a», тоді як завдання, які ви плануєте за допомогою пакету (розглянуто далі в цій статті), потрапляють в чергу «b».
Особа, яка запланувала роботу.
Використання at у командному рядку
Вам не потрібно використовувати at в інтерактивному режимі; ви також можете використовувати його в команді. Це полегшує використання всередині сценаріїв.
Ви можете передавати команди в at, наприклад:
echo "sh ~/sweep.sh" | at 08:45 AM
Завдання прийнято та заплановано до о, а номер завдання та дата виконання повідомляються так само, як і раніше.
Використання at з файлами команд
Ви також можете зберегти послідовність команд у файлі, а потім передати її в at. Це може бути звичайний текстовий файл команд — це не обов’язково має бути виконуваний сценарій.
Ви можете використовувати параметр -f (файл) у такий спосіб, щоб передати ім’я файлу на адресу:
at now + 5 minutes -f clean.txt
Ви можете досягти того ж результату, якщо переспрямувати файл за адресою:
at now + 5 minutesRemoving 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:
atqatrm 11atqЯк переглянути детальний огляд вакансій
Як ми вже згадували раніше, ви можете планувати роботу далеко в майбутньому. Іноді ви можете забути, що збирається виконувати робота. Команда atq показує вам завдання в черзі, але не показує, що вони збираються робити. Якщо ви хочете побачити детальний перегляд завдання, ви можете використовувати параметр -c (кішка).
Спочатку ми використаємо atq, щоб знайти номер роботи:
atqТепер ми будемо використовувати завдання номер 13 з опцією -c:
at -c 13Ось розбивка інформації, яку ми отримуємо про роботу:
Перший рядок: це повідомляє нам, що команди виконуватимуться під оболонкою sh.
Другий рядок: ми бачимо, що команди виконуватимуться як з ідентифікатором користувача, так і з групою 1000. Це значення для людини, яка запустила команду at.
Третій рядок: людина, яка отримує будь-які електронні листи, відправляє.
Четвертий рядок: The Маска користувача дорівнює 22. Це маска, яка використовується для встановлення дозволів за замовчуванням для будь-яких файлів, створених у цьому сеансі sh. Маска віднімається від 666, що дає нам 644 (вісімковий еквівалент rw-r--r--).
Дані, що залишилися: більшість із них є змінними середовища.Результати тесту. Тест перевіряє, чи можна отримати доступ до каталогу виконання. Якщо це не вдається, виникає помилка, і виконання завдання припиняється.
Команди, які потрібно виконати. Вони відображаються в списку, а також відображається вміст запланованих сценаріїв. Зауважте, що хоча сценарій у нашому прикладі вище був написаний для виконання під Bash, він все одно виконуватиметься в оболонці sh.Пакетна команда
Пакетна команда діє аналогічно на команду, але з трьома суттєвими відмінностями:
Ви можете використовувати команду пакета лише в інтерактивному режимі.
Замість того, щоб планувати виконання завдань у певний час, ви додаєте їх до черги, і пакетна команда виконує їх, коли середнє навантаження системи нижче 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.allow. Ми збираємося додати Дейва і Мері, але нікому іншому не буде дозволено використовувати at.
Спочатку вводимо наступне:
sudo gedit /etc/at.allowУ редакторі ми додаємо два назви, як показано нижче, а потім зберігаємо файл.
Якщо хтось інший спробує використати at, йому скажуть, що він не має дозволу. Наприклад, скажімо, що користувач на ім’я Ерік вводить таке:
atЙому було б відмовлено, як показано нижче.
Знову ж таки, Еріка немає у файлі at.deny. Щойно ви додаєте будь-кого до файлу at.allow, будь-якому та всім іншим буде відмовлено у дозволі на використання at.
Чудово підходить для одноразових
Як бачите, і at, і пакет ідеально підходять для завдань, які потрібно виконати лише один раз. Знову, як короткий огляд:
Якщо вам потрібно зробити щось, що не є звичайним процесом, заплануйте це за адресою.
Якщо ви хочете запустити завдання лише тоді, коли завантаження системи досить низьке, використовуйте пакетний режим.