Практика бд. Операционные. Министерство образования и науки российской федерации университет итмо д. А. Зубок, А. В. Маятин
Скачать 324.61 Kb.
|
|
Генератор | Обработчик |
#!/bin/bash while true; do read LINE case $LINE in STOP) kill -USR1 $(cat .pid) ;; *) : ;; esac done | #!/bin/bash echo $$ > .pid A=1 MODE="rabota" usr1() { MODE="ostanov" } trap 'usr1' USR1 while true; do case $MODE in "rabota") let A=$A+1 echo $A ;; "ostanov") echo "Stopped by SIGUSR1" exit ;; esac sleep 1 done |
В этом случае скрипт «Генератор» будет в бесконечном цикле считывать строки с консоли и бездействовать (используется оператор : ) для любой входной строки, кроме строки STOP, получив которую, он отправит пользовательский сигнал USR1 процессу «Обработчик». Поскольку процесс
«Генератор» должен знать PID процесса «Обработчик», передача этого идентификационного номера осуществляется через скрытый файл. В процессе
«Обработчик» определение PID процесса производится с помощью системной переменной $$.
Процесс «Обработчик» выводит на экран последовательность натуральных чисел до момента получения сигнала USR1. В этот момент
запускается обработчик usr1(), который меняет значение переменной MODE. В результате на следующем шаге цикла будет выведено сообщение о прекращении работы в связи с появлением сигнала, и работа скрипта будет завершена.
Задание на лабораторную работу
Создайте скрипты или запишите последовательности выполнения команд для перечисленных заданий и предъявите их преподавателю.
Создайте и однократно выполните скрипт (в этом скрипте нельзя использовать условный оператор и операторы проверки свойств и значений), который будет пытаться создать директорию test в домашней директории. Если создание директории пройдет успешно, скрипт выведет в файл /report сообщение вида "catalog test was created successfully" и создаст в директории test файл с именем Дата_Время_Запуска_Скрипта. Затем независимо от результатов предыдущего шага скрипт должен опросить с помощью команды ping хост www.net_nikogo.ru и, если этот хост недоступен, дописать сообщение об ошибке в файл /report.
Задайте еще один однократный запуск скрипта из пункта 1 через 2 минуты. Организуйте слежение за файлом /report и выведите на консоль новые строки из этого файла, как только они появятся.
Задайте запуск скрипта из пункта 1 каждые 5 минут каждого часа в день недели, в который вы будете выполнять работу.
Создайте два фоновых процесса, выполняющих одинаковый бесконечный цикл вычисления (например, перемножение двух чисел). После запуска процессов должна сохраниться возможность использовать виртуальные консоли, с которых их запустили. Используя команду top, проанализируйте процент использования ресурсов процессора этими процессами. Добейтесь, чтобы тот процесс, который был запущен первым, использовал ресурс процессора не более чем на 20%.
Процесс «Генератор» передает информацию процессу «Обработчик» с помощью файла. Процесс «Обработчик» должен осуществлять следующую обработку новых строк в этом файле: если строка содержит единственный символ «+», то процесс «Обработчик» переключает режим на сложениеи ждет ввода численных данных. Если строка содержит единственный символ «*», то обработчик переключает режим на умножение и ждет ввода численных данных. Если строка содержит целое число, то обработчик осуществляет текущую активную операцию (выбранный режим) над текущим значением вычисляемой переменной и считанным значением (например, складывает или перемножает результат
предыдущего вычисления со считанным числом). При запуске скрипта режим устанавливается в сложение, а вычисляемая переменная приравнивается к 1. В случае получения строки QUIT скрипт выдает сообщение о плановой остановке и завершает работу. В случае получения любых других значений строки скрипт завершает работу с сообщением об ошибке входных данных.
Процесс «Генератор» считывает строки с консоли, пока ему на вход не поступит строка TERM. В этом случае он посылает системный сигнал SIGTERM процессу обработчику. Процесс «Обработчик» (как и в примере, выводящий в бесконечном цикле натуральное число каждую секунду) должен перехватить системный сигнал SIGTERM и завершить работу, предварительно выведя сообщение о завершении работы по сигналу от другого процесса.
Процесс «Генератор» считывает с консоли строки в бесконечном цикле. Если считанная строка содержит единственный символ «+», он посылает процессу «Обработчик» сигнал USR1. Если строка содержит единственный символ «*», генератор посылает обработчику сигнал USR2. Если строка содержит слово TERM, генератор посылает обработчику сигнал SIGTERM. Другие значения входных строк игнорируются. Обработчик добавляет 2 или умножает на 2 текущее значение обрабатываемого числа (начальное значение принять на единицу) в зависимости от полученного пользовательского сигнала и выводит результат на экран. Вычисление и вывод производятся один раз в секунду. Получив сигнал SIGTERM, «Обработчик» завершает свою работу, выведя сообщения о завершении работы по сигналу от другого процесса.