Отложенное и регулярное выполнение заданий
Переходим к заданиям потруднее. По традиции будет представлен формат: вопрос — ответ. Разберем работу с процессами, сигналами и приоритетами в 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 и таблица с заданиями отобразилась.
Linux отложенный запуск команды
Периодически возникают ситуации, когда необходимо запустить скрипт или приложение с задержкой спустя некоторое время после включения / перезагрузки системы. Есть несколько способов, можно использовать crontab или systemd.
Отложенный запуск — CRONTAB
Здесь достаточно открыть на редактирование crontab:
Указать путь к скрипту / приложению использовав параметры @reboot + sleep:
Из листинга ясно, что по таймауту в 10 секунд произойдет запуск скрипта check-service.sh
Отложенный запуск — SYSTEMD
Здесь можно использовать systemd таймер + systemd юнит, для начала создадим тестовый скрипт, который будет складывать в лог дату и время в момент своего запуска:
Тестовый скрипт можно разместить куда угодно, например в /tmp и разрешить его выполнение:
Создать юнит для запуска скрипта:
Теперь наступило время таймера, смотрим какие есть в принципе:
Где тймаут запуска 3 минуты, после чего необходимо обновить конфигурацию systemd:
Далее с целью эксперимента выключаем тестовый сервис:
Проверка
Перезагружаем систему, смотрим состояние таймера:
Видно, что до запуска осталось 2 минуты 27 секунд, проверяем список таймеров:
Далее, по факту отведенного времени проверяем лог:
2 мин для чтения Использование команды Sleep в скриптах Bash в Linux
Главное меню » Операционная система Linux » Использование команды Sleep в скриптах Bash в Linux
Команда sleep в Linux – одна из самых простых команд. Как видно из названия, его единственная функция – спать. Другими словами, он вводит задержку на указанное время.
Таким образом, если вы используете команду sleep с x, то следующая команда может быть запущена только через x секунд.
Команда Sleep имеет простой синтаксис:
Здесь суффикс может быть:
Давайте посмотрим несколько примеров команды sleep.
Примеры команды Sleep в Bash
Хотя вы можете использовать его непосредственно в оболочке, команда sleep обычно используется для введения задержки в выполнение сценария bash. Мы собираемся показать использование команды sleep через примеры сценариев bash.
Команда sleep без суффикса считается в секундах
Предположим, вы хотите приостановить ваш bash-скрипт на 5 секунд, вы можете использовать режим sleep следующим образом:
В примере скрипта bash это может выглядеть так:
Если вы запустите его с помощью команды time, вы увидите, что скрипт bash на самом деле работал (немного) более 5 секунд.
Команда Sleep с суффиксом m, h или d
Вы можете указать время sleep в минутах следующим образом:
Это приостановит скрипт/оболочку на одну минуту. Если вы хотите отложить сценарий на несколько часов, вы можете сделать это с помощью опции h:
Даже если вы хотите приостановить скрипт на несколько дней, вы можете сделать это с помощью суффикса d:
Это может помочь, если вы хотите работать в разные дни или дни недели.
Команда sleep с комбинацией секунд, минут, часов и дня
Вы не обязаны использовать только один суффикс за раз. Вы можете использовать более одного суффикса, и продолжительность sleep является суммой всех суффиксов.
Например, если вы используете следующую команду:
Это заставит скрипт ждать 1 час 10 минут и 5 секунд. Обратите внимание, что суффикс s здесь по-прежнему необязателен.
Бонусный совет: спать меньше секунды
Вы могли заметить, что наименьшая единица времени в команде sleep – секунда. Но что если ваш bash-скрипт будет спать в течение миллисекунд?
Хорошо, что вы можете использовать с плавающей точкой (десятичные точки) с командой sleep.
Поэтому, если вы хотите ввести паузу в 5 миллисекунд, используйте ее следующим образом:
Вы также можете использовать десятичные точки с другими суффиксами.
Будет введена задержка в 1 час 37 минут и 30 секунд.
Мы надеемся, что вы не спали, читая эти примеры команды sleep -).
Если у вас есть вопросы или предложения, пожалуйста, не стесняйтесь спрашивать.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
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», чтобы указать время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание должно быть выполнено сегодня, то дату вводить не надо.