- Отложенный запуск команды linux
- Отложенный запуск сервисов
- Отложенное и регулярное выполнение заданий
- Процессы, сигналы и приоритеты
- Отложенное и регулярное выполнение задач
- Команда at в Linux
- Установка at
- Как использовать команду at
- batch команда
- Указание времени выполнения
- Указание очереди
- Список незавершенных вакансий
- Удаление незавершенных заданий
- Ограничение пользователей
- Выводы
Отложенный запуск команды linux
Команды batch и at позволяют вам определять время запуска команды или последовательности команд. При помощи команды batch система определяет время запуска команды, вы это можете определить с помощью команды at . Обе команды ожидают ввод со стандартного ввода (терминала); список команд, вводимых с терминала, должен завершаться нажатием клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).
Команда batch очень полезна, если вы запускаете процесс или программу, которые занимают много системного времени. Команда batch представляет системе задание (содержащее последовательность команд для выполнения). Задание ставится в очередь и запускается как только у системы появляется возможность. Это позволяет системе быстро отвечать на запросы других пользователей. Общий формат команды batch : Если запускается только одна команда, то ее можно ввести в одной командной строке:
В следующем примере batch используется для выполнения команды grep в согласованное время. Команда grep осуществляет поиск всех файлов в текущем каталоге и перенаправляет вывод в файл dol.file.
После того как вы зададите задание batch , система выдаст ответ, в котором даны номер задания, дата и время. Номер задания не то же самое, что номер процесса, который система генерирует, когда вы запускаете команду в фоновом режиме.
Команда at позволяет вам указывать точное время выполнения команд. Общий формат команды at : Аргумент time состоит из времени дня и даты, если дата не сегодняшняя.
В следующем примере показано, как использовать команду at для посылки сообщения happy birthday пользователю с регистрационным именем emily:
Обратите внимание, что команда at подобно команде batch выдает ответ с номером задания, датой и временем.
Если вы не хотите, чтобы команды, находящиеся в данный момент в очереди заданий batch или at были выполнены, то можете удалить их из очереди. Для этого воспользуйтесь опцией -r в команде at , указав ее с номером задания. Общий формат такой команды: Если вы забыли номер задания, то команда at -l распечатает вам список текущих заданий в очереди batch или at , как показано на следующем экране:
Таким образом команда at выполняет команды в указанное время. Вы можете использовать от одной до 4-х цифр и буквосочетания «am» и «pm», чтобы указать время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание должно быть выполнено сегодня, то дату вводить не надо.
Источник
Отложенный запуск сервисов
Внимательно пролистал ман к systemctl , но не обнаружил в нем возможности отложить запуск сервиса.
Например, нужно задержать его на 10 секунд.
Временно сделал его по старинке с помощью cron —
но проблема в том, что по некоторым причинам нужно реализовать его именно с помощью возможностей systemd.
Как же это сделать?
например sleep в ExecStartPre или сделать таймер
Например, нужно задержать его на 10 секунд.
но вот тут что-то не так, т.к. одной из целей в systemd было убрать хардкодные задержки и заменить их на «события».
Конечно, не так. Это и есть обратная сторона systemd.
Дело в том, что некоторые внешние устройства при быстром запуске их сервиса не успевают инициализироваться, уж такими их умудрились сделали.
Помогает лишь задержка на несколько секунд.
sleep в ExecStartPre или сделать таймер
Можете накидать примеры этих способов?
Можете накидать примеры этих способов?
некоторые внешние устройства при быстром запуске их сервиса не успевают инициализироваться
задержка старта сервиса по идее не влияет на скорость инициализации. Имеется в виду инициализация после включения питания или подключения к интерфейсу?
Если сервис в таких случаях завершается, то можно в юните прописать ему рестарт с задержкой. Так же можно попробовать запустить с помощью правил udev после определения устройства.
После включения питания системного блока с постоянно подключенными устройствами.
Поговаривают, что это из-за какого-то кривого драйвера этих устройств, но никто не берется его исправить.
Вот все и выкручиваются, как умеют.
Есть параметр TimeoutStartSec, через который можно задать ожидание перед запуском.
Изменить параметры можно через Drop-in.
а вдруг 10 секунд в некоторорых случаях перестанет хватать? При рестарте сервиса жди N секунд — если работаешь не один и твой товарищ не в курсе или забыл, то он может решить, что возникла какая-то проблема (systemctl ждет когда юнит отработает полностью). И т.д.
рестарт с задержкой при падении (если сервис падает)
Дело в том, что некоторые внешние устройства при быстром запуске их сервиса не успевают инициализироваться, уж такими их умудрились сделали.
Тут правильнее смотреть, как корректнее чекать инициализацию девайса, и через udev отдавать виртуальный .device. А юниты активировать по появлению девайса
это не ожидание перед запуском. Это время ожидания подтверждения успешного запуска
Спасибо за уточнение.
По вашему «кривому» 🙂 способу
работает как часы, проверял top’ом.
не работает вообще. Ну и ладно, не очень-то и хотелось.
Не знаю только, стоит ли добавлять перезапуск при сбоях —
Если он так полезен, то почему он не установлен по дефолту?
он не полезен, это просто еще один костыль. Я склоняюсь к тому, что запуском после сбоя должен заниматься человек, хотя все зависит от ситуации: вылет cupsd меня не сильно волнует, а вот упавшая БД другое дело.
Но при команде systemctl restart my_service не работает вообще. Ну и ладно, не очень-то и хотелось.
Ну стоило бы посмотреть systemctl status my_service и понять, почему рестарт не работает.
Есть гарантия что всего задержки 10 достаточно? Вдруг однажды 15 нужно будет?
В systemd.timer есть такая возможность, но я не помню синтаксис. Внесите intelfx .
Внимательно пролистал ман к systemctl , но не обнаружил в нем возможности отложить запуск сервиса.
Тебе нужно отложить запуск однократно?
Или сделать так, чтобы юнит в принципе запускался через N после загрузки ОС?
Есть гарантия что всего задержки 10 достаточно? Вдруг однажды 15 нужно будет?
Откуда вообще возникла потребность в задержке?
Дело в том, что некоторые внешние устройства при быстром запуске их сервиса не успевают инициализироваться, уж такими их умудрились сделали. Помогает лишь задержка на несколько секунд.
Что за устройство? Что понимается под «инициализацией»? Оно обнаруживается через несколько секунд или уже после обнаружения ещё какое-то время не готово к работе?
Устройство — известный всем USB-приемник для приема TV-программ, в народе именуемый «свистком» и который сейчас для чего только не используют.
Больше ничего неизвестно, но народ опытным путем вычислил, что для определения (или инициализации) этих свистков 5 секунд обычно всегда хватает, а чтобы была гарантия, ставят 10.
Я склоняюсь к тому, что запуском после сбоя должен заниматься человек,
Конечно. это правильнее, но не всегда у человека есть время мониторить этот сбой, куда проще сделать перезапуск после него.
Ты самого главного не сказал: он определяется 5 секунд или после определения ещё 5 секунд неработоспособен?
Не знаю насчет определения, но если не ввести задержку для сервиса, то он не работает вообще, сколько ни жди
А если ввести задержку 5 сек для запуска его сервиса, то после истечения этих 5 секунд он начинает работать сразу.
Источник
Отложенное и регулярное выполнение заданий
Переходим к заданиям потруднее. По традиции будет представлен формат: вопрос — ответ. Разберем работу с процессами, сигналами и приоритетами в Bash. Также затронем тему выполнения отложенных задач, и, разумеется, напишем их сами.
Процессы, сигналы и приоритеты
Узнать имя файла устройства того терминала, на котором вы вошли в сеанс.
tty
Вывести список запущенных в текущем терминале процессов.
ps
Вывести список всех процессов, в виде таблицы с колонками ID процесса, ID родительского процесса, имя процесса.
ps -A
Выведите список процессов, запущенных пользователями, вошедшими в сеанс.
w
Получите список всех процессов, связанных с терминалами.
ps -t
Выведите PID процессов, связанных с каталогом /usr.
ps -C /usr
Выведите список процессов, содержащих «man» в имени.
ps -f | grep man
Получите иерархический список процессов с помощью команды ps (не pstree).
ps axjf
Вывести id текущей оболочки bash.
echo $$
Найдите пустые файлы в каталоге linux_lab2 в фоновом режиме.
find d1/ -empty &
Подтвердите тип содержимого двух из найденных файлов?
file pusto-1
Запустить в фоновом режиме команду sleep 1000 и sleep 2000. Вывести информацию о запущенных задачах.
sleep 1000 &
sleep 2000 &
jobs
Убить одной командой все запущенные задачи sleep.
pkill sleep
Проверить, как задача sleep 1000, запущенная в фоновом режиме, реагируют на сигналы HUP, INT, QUIT, TRAP, KILL, TERM.
hup — Обрыв терминальной линии
int — Прерывание
quit — Выход
trap — Ловушка трассировки/останова
kill — убито
TERM — Завершено
Запрограммировать оболочку bash таким образом, чтобы при получении ей сигнала HUP она выводила список всех запущенных процессов в файл, содержащий в названии id текущей оболочки bash.
trap » ps > file-$(echo $$)» HUP
Запустите команду sleep 10000 в фоновом режиме с приоритетом 10.
nice -n 10 sleep 10000 &
Увеличьте приоритет предыдущей команды на 6 пунктов.
renise 16 3541[id]
Уменьшите приоритет предыдущей команды на 10 пунктов.
Приоритет изменился? Как изменить приоритет?
renise 6 3541[id] (Приоритет не изменился, отказано в доступе. Можно изменить от root.)
От имени суперпользователя запустить команду индексирования базы данных поиска в следующем виде: sudo time nice -n 19 updatedb. Затем выполните такую же команду, в которой значение nice number для updatedb будет 5. Сравнить полученные
результаты.
Ответ: при запуске одинаковых команд с разными приоритетами время выполнение тоже будет разное.
От имени обычного пользователя попытайтесь запустить оболочку bash со значением nice number, равным -1. Какое сообщение выводится?
nice: невозможно установить значение nice: Отказано в доступе.
Для непрерывного просмотра запущенных в системе процессов установите время обновления 10 сек. Какое время установлено по умолчанию?
top -d 10
6 сек по умолчанию
Просмотрите список запущенных вами процессов в непрерывном режиме.
top -u nikiqq
Организуйте завершение команды top после десяти обновлений.
top -n 10
Отложенное и регулярное выполнение задач
Создайте файл, содержащий полный список процессов, полученный через 10 минут от текущего времени.
at now +10 minutes
at> ps > file1
at> «Ctrl + d»
Проверьте, запущены ли какие-нибудь задания в cron или at для пользователя root.
at -l
crontab -l
При помощи команды at сделать так, чтобы ровно через 5 минут от текущего времени произошла запись списка всех процессов в файл с именем, содержащим в своём названии системное время на момент записи.
at now + 5 minutes
at> ps > file-$(date +%T)
at> «Ctrl + d»
При помощи команды at организовать обычное завершение работы браузера firefox или chrome в 16:00.
at 16:00
at> pkill firefox
at> «Ctrl + d»
Сделать при помощи cron так, чтобы команда updatedb запускалась раз в сутки, каждый час, каждые 5 минут.
echo ’58 16 * * * updatedb’ > crontab1
echo ’58 * * * * updatedb’ > crontab1
echo ‘*/5 * * * * updatedb’ > crontab1
При помощи команды at сделать так, чтобы через 5 минут от текущего времени создалось задание для cron, которое создавало бы каждые 9 минут ещё одно задание для cron, заключающееся в том, чтобы каждые 7 минут уничтожать все задания пользователя для cron.
at now + 5 minutes
at> echo ‘9 * * * * echo ‘7 * * * * pkill cron » > crontab1
at> crontab crontab1
at> «Ctrl + d»
Ежедневно в 10:30 требуется получать список пользователей, входивших в сеанс в последнее время.
echo ’30 10 * * * last’ > crontab1
crontab -e (заходим в редактор)
crontab crontab1 ( устанавливаем таблицу)
от root: crontab -e -u nikiqq
в редакторе выбираем цифру 1 и таблица с заданиями отобразилась.
Источник
Команда at в Linux
at — это утилита командной строки, которая позволяет вам планировать выполнение команд в определенное время. Задания, созданные с помощью at , выполняются только один раз.
В этой статье мы расскажем , как использовать at и его компаньоны утилитами batch , atq , atrm просматривать, удалять и создавать новые рабочие места , которые должны выполняться в более позднее время.
Установка at
В зависимости от дистрибутива at может присутствовать или отсутствовать в вашей системе Linux.
Если at не установлен, вы можете легко установить его с помощью диспетчера пакетов вашего дистрибутива.
- Установить at Ubuntu и Debian
- Установить at CentOS и Fedora
После установки программы убедитесь, что atd , демон планирования запущен и настроен на запуск при загрузке:
Как использовать команду at
Упрощенный синтаксис команды at выглядит следующим образом:
Команда at принимает дату и время ( runtime ), когда вы хотите выполнить задание, как параметр командной строки, и команду, которая должна быть выполнена из стандартного ввода.
Создадим задание, которое будет выполнено в 9:00:
Как только вы нажмете Enter , вам будет представлена командная строка at которая чаще всего начинается с at> . Вы также увидите предупреждение о том, в какой оболочке будет выполняться команда:
Введите одну или несколько команд, которые хотите выполнить:
Когда вы закончите вводить команды, нажмите Ctrl-D чтобы выйти из подсказки и сохранить задание:
Команда отобразит номер задания, время и дату выполнения.
Есть и другие способы , чтобы пройти команду , которую вы хотите запустить, помимо ввода команды в at строке. Один из способов — использовать echo и направить команду по at :
Другой вариант — использовать здесь документ :
Чтобы читать команды из файла вместо стандартного ввода, вызовите команду с параметром -f путь к файлу. Например, чтобы создать задание, которое будет запускать скрипт /home/linuxize/script.sh :
По умолчанию, если команда производит вывод, at отправит электронное письмо с выводом пользователю после завершения задания. Invoke at с -M опцией для подавления уведомлений по электронной почте:
Используйте -m чтобы отправить электронное письмо, даже если нет вывода:
batch команда
batch или его псевдоним at -b планирует задания и выполняет их в пакетной очереди, если позволяет уровень загрузки системы. По умолчанию задания выполняются, когда средняя загрузка системы ниже 1,5. Значение нагрузки можно указать при вызове демона atd . Если средняя загрузка системы выше указанной, задания будут ждать в очереди.
Чтобы создать batch задание, передайте команды, которые хотите выполнить:
Указание времени выполнения
Утилита at поддерживает широкий диапазон временных характеристик. Вы можете указать время, дату и приращение от текущего времени:
- Время — чтобы указать время, используйте форму HH:MM или HHMM . Чтобы указать 12-часовой формат времени, используйте am или pm после времени. Вы также можете использовать такие строки, как now , midnight , noon или teatime (16:00). По истечении указанного времени задание будет выполнено на следующий день.
- Дата — команда позволяет запланировать выполнение задания на заданную дату. Дату можно указать, используя название месяца, за которым следует день и (необязательно) год. Вы можете использовать строки, например, today , tomorrow или будний день. Дата также может быть указана в MMDD[CC]YY , MM/DD/[CC]YY , DD.MM.[CC]YY или [CC]YY-MM-DD .
- Increment — at также принимает приращения в формате now + count time-unit , где count — это число, а time-unit может быть одной из следующих строк: minutes , hours , days или weeks .
Время, дату и приращение можно комбинировать, вот несколько примеров:
- Запланируйте работу на ближайшее воскресенье на время на десять минут позже текущего:
- Запланируйте запуск задания на 13:00 через два дня:
- Запланируйте запуск задания на 12:30 21 октября 2020 г .:
- Запланируйте запуск задания через час:
Вы также можете указать время и дату в [[CC]YY]MMDDhhmm[.ss] используя параметр -t . Вот пример:
Указание очереди
По умолчанию задания, созданные с помощью at , планируются в очереди с именем a а задания, созданные с помощью batch , планируются в очереди b .
Запросы могут иметь имена от a до z и от A до Z Очереди с меньшими буквами работают с меньшей аккуратностью, что означает, что они имеют приоритет над очереди с более высокими буквами.
Вы можете указать очередь с помощью опции -q . Например, чтобы установить задание в L очередь, вы должны запустить:
Список незавершенных вакансий
Чтобы вывести список ожидающих заданий пользователя, выполните atq или at -l :
В выводе будут перечислены все задания, по одному в каждой строке. Каждая строка включает номер задания, дату, время, букву очереди и имя пользователя.
Когда atq вызывается от имени администратора, он перечисляет ожидающие задания всех пользователей.
Удаление незавершенных заданий
Чтобы удалить отложенное задание, atrm команду atrm или at -r после которой atrm номер задания. Например, чтобы удалить задание с номером девять, вы должны запустить:
Ограничение пользователей
/etc/at.deny и /etc/at.allow позволяют контролировать, какие пользователи могут создавать задания с помощью команды at или batch . Файлы состоят из списка имен пользователей, по одному имени пользователя в строке.
По умолчанию существует только файл /etc/at.deny и он пуст, что означает, что все пользователи могут использовать команду at . Если вы хотите отказать в разрешении определенному пользователю, добавьте имя пользователя в этот файл.
Если файл /etc/at.allow существует, только пользователи, перечисленные в этом файле, могут использовать команду at .
Если ни один из файлов не существует, только пользователи с правами администратора могут использовать команду at .
Выводы
Утилита at считывает команды со стандартного ввода и выполняет их позже. В отличие от crontab , задания, созданные с помощью at , выполняются только один раз.
Для получения дополнительной информации обо всех доступных параметрах команды at введите man at в вашем терминале.
Если у вас есть вопросы, не стесняйтесь оставлять комментарии.
Источник