Подоболочки Bash и параллельная обработка
А оболочка это базовый интерфейс для ввода команд на Linux система. С его помощью вы можете ввести команду напрямую или указать файл (скрипт), содержащий последовательность команд, которые должны быть выполнены. Оболочки организованы в иерархию, и любая оболочка может создать новую оболочку. Новая оболочка считается дочерним процессом - подоболочка- родительской оболочки, которая ее создает.
По умолчанию подоболочка зависит от своего родителя в том смысле, что если родительский процесс завершается, подоболочка также завершается. Любой вывод передается из подоболочки в родительскую оболочку.
Как создать подоболочку
В сценарии оболочки Bash создайте подоболочку, используя обозначение круглых скобок:
#! / bin / bash
# subshell-example.sh с бесконечным циклом
(
в то время как [1]
делать
echo "Подоболочка запущена.. ."
сделано
)
В этом примере цикл while заключен в круглые скобки, что заставляет его выполняться в подоболочке оболочки, в которой выполняется файл сценария.
Запуск подоболочки в фоновом режиме
Если вы не укажете, что подоболочка должна выполняться в фоновом режиме, родительская оболочка ожидает завершения подоболочки, прежде чем продолжить выполнение остальной части скрипта. Однако, чтобы запускать подоболочки параллельно, запускайте их в фоновом режиме, что достигается с помощью символа амперсанда, следующего за выражением подоболочки, как показано здесь:
#! / bin / bash
для IP в {1..254}; делать
хост = 192.168.1. $ ip
(пинг -c 1 $ хост> / dev / null
если ["$?" = 0]
тогда
echo $ host
fi) &
сделано
Параллельное выполнение нескольких подоболочек
Если вы создаете несколько подоболочек как фоновые процессы, вы можете запускать задачи параллельно. Обычно операционная система использует разные процессоры или ядра для каждого процесса и подпроцесса, при условии, что количество процессоров или ядер равно количеству процессов. В противном случае задачи назначаются одним и тем же процессорам или ядрам. В этом случае процессор или ядро постоянно переключается между назначенными задачами, пока задачи не будут выполнены.
Используйте оператор ожидания, чтобы сообщить родительскому процессу, чтобы он дождался завершения подпроцессов, прежде чем продолжить выполнение остальной части скрипта:
Использование субоболочек
Подоболочки полезны, когда команды должны выполняться в определенной среде или каталоге. Если каждая команда выполняется в отдельной подоболочке, нет риска перепутать настройки переменных. По завершении настройки и текущий каталог не нужно восстанавливать, поскольку на среду родительского процесса не влияет ни один из его подпроцессов.
Подоболочки работают с определениями функций, которые могут выполняться много раз с разными параметрами.