Bash подоболочки и параллельная обработка

Оболочка — это базовый интерфейс для ввода команд в системе Linux. С его помощью вы можете ввести команду напрямую или указать файл (скрипт), который содержит последовательность команд, которые должны быть выполнены. Оболочки организованы в иерархию, и любая оболочка может создать новую оболочку. Новая оболочка считается дочерним процессом — подоболочкой — родительской оболочки, которая его создает.

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

Как создать подоболочку

В сценарии оболочки Bash вы создаете подоболочку, используя обозначение в скобках:

В этом примере цикл while заключен в круглые скобки, что приводит к его выполнению в подоболочке оболочки, в которой выполняется файл сценария.

Запуск Subshell в фоновом режиме

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

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

Если вы создаете несколько субоболочек в качестве фоновых процессов, вы можете запускать задачи параллельно. Как правило, операционная система использует разные процессоры или ядра для каждого процесса и подпроцесса, при условии, что процессоров или ядер по крайней мере столько же, сколько существует процессов. В противном случае задачи назначаются одним и тем же процессорам или ядрам. В этом случае процессор или ядро ​​постоянно переключаются между назначенными задачами до тех пор, пока задачи не будут выполнены. В следующем примере есть два подпроцесса. Первый из них считается от 1 до 99, а второй от 1000 до 1099.

Используйте оператор wait, чтобы указать родительскому процессу дождаться завершения подпроцессов, прежде чем продолжить работу с остальным сценарием:

Использование для оболочек

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

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

Ссылка на основную публикацию