Підоболонки Bash і паралельна обробка

А оболонка є основним інтерфейсом для введення команд на a Linux системи. З його допомогою ви можете безпосередньо ввести команду або вказати файл (скрипт), який містить послідовність команд, які потрібно виконати. Оболонки організовані в ієрархію, і будь-яка оболонка може створити нову оболонку. Нова оболонка вважається дочірнім процесом — a підоболонка— батьківської оболонки, яка його створює.

За замовчуванням підоболонка залежить від свого батька в тому сенсі, що якщо батьківський процес завершується, підоболонка також завершується. Будь-який висновок передається з підоболонки в батьківську оболонку.

різні оболонки Linux

Як створити підоболочку

У сценарії оболонки Bash створіть підоболонку, використовуючи позначення в дужках:

#!/bin/bash
# subshell-example.sh з нескінченним циклом
(
поки [ 1 ]
робити
echo «Запущена підоболонка.. ."
зроблено
)

У прикладі цикл while укладено в дужки, що призводить до його виконання в підоболонці оболонки, в якій виконується файл сценарію.

Запуск підоболонки у фоновому режимі

Якщо ви не вкажете, що підоболонка має виконуватися у фоновому режимі, батьківська оболонка чекає завершення підоболонки, перш ніж продовжити роботу з рештою сценарію. Однак, щоб паралельно запускати підоболонки, запустіть їх у фоновому режимі, що виконується за допомогою символу амперсанда після виразу підоболонки, як показано тут:

#!/bin/bash 
для ip в {1..254}; робити
host=192.168.1.$ip
(ping -c 1 $host > /dev/null
якщо [ "$?" = 0 ]
тоді
echo $host
fi) &
зроблено

Паралельний запуск кількох підоболонок

Якщо ви створюєте кілька підоболонок як фонові процеси, можна виконувати завдання паралельно. Зазвичай операційна система використовує різні процесори або ядра для кожного процесу і підпроцесу, припускаючи, що процесорів або ядер принаймні стільки, скільки процесів. В іншому випадку завдання призначаються тим же процесорам або ядрам. У цьому випадку процесор або ядро ​​постійно перемикаються між призначеними завданнями, доки завдання не будуть завершені.

Використовуйте оператор wait, щоб повідомити батьківському процесу дочекатися завершення підпроцесів, перш ніж перейти до решти сценарію:

Використовується для підоболонок

Підоболонки корисні, коли команди потрібно виконати в певному середовищі або каталозі. Якщо кожна команда виконується в іншій підоболонці, немає ризику переплутати параметри змінних. Після завершення налаштування та поточний каталог не потрібно відновлювати, оскільки жоден з його підпроцесів не впливає на середовище батьківського процесу.

Підоболонки працюють з визначеннями функцій, виконуваними багато разів з різними параметрами.