#bash #асинхронность #процесс
Вопрос по bash Хочу запустить неск. экземпляров приложения(ий) параллельно из сценария для bash. Нужно что-то вроде синхронизации. Запускаю через & . При этом получается, что запускающий скрипт не знает о дальн. "судьбе" запущенного процесса. Например, хотелось бы, использовать: Ожидание. После запуска всех нужных (параллельно запущенных) приложений, запустивший их скрипт ждал, пока все они не завершатся и/или какие-н. из них. После окончания, напр., скрипт м. выдать сообщения, что операция завершена. Прерывание. Если из скрипта запущено много процессов, через диспетчер процессов неудобно их принудительно завершать (в случае, когда ждать надоедает). Если бы дочерний процесс был запущен последовательно (без &), то закрыв окно консоли, из которой был запущен скрипт, завершились (принудительно) и все порождённые им процессы. Хотелось бы получить что-то вроде того и для параллельно (через &) запущенных процессов. Напр., скрипт спрашивает, "завершить ли дочерние процессы?", ввожу что-л. в консоли и все параллельно запущенные процессы принудительно завершаются. ВОПРОС: как вообще по-нормальному (без изобретения велосипедов) это в bash можно сделать и вообще, можно ли? По запросу @alexander-barakin - неработающий wait: Файл: inv_3.BASh #!/bin/bash declare Path="$(dirname "${0}")"; Path="${Path%/}/"; declare Data="${Path}t2.data.fifo"; declare Can_write="${Path}t2.can.fifo"; trap "echo _ > \"${Can_write}\"; " Usr1; aValue=$BASHPID; bash "${Path}sub_3.BASh" $aValue & wait; echo ; echo " JOBS:"; jobs -pr; echo ; echo "Завершено." Файл: sub_3.BASh #!/bin/bash declare theRecievers="${1}"; declare Path="$(dirname "${0}")"; Path="${Path%/}/"; declare Data="${Path}t2.data.fifo"; declare Can_write="${Path}t2.can.fifo"; trap "echo $BASHPID: END" Exit; kill -s Usr1 ${theRecievers}; i=2; while ((i--)); do while ! read < "${Can_write}"; do kill -s Usr1 ${theRecievers}; done; done; Воспроизведение: Создаёте файлы inv_3.BASh, sub_3.BASh В том же каталоге создаёте pipe: t2.can.fifo, t2.data.fifo В консоли: bash "inv_3.BASh"; echo $?; Ожидаемое (от wait) поведение: Сценарий, в котором вызывается wait не выполняет команды после wait, пока не завершится доч. процесс, т. е., вывода "... JOBS: ..." вообще не д. быть до завершения доч. процесса. Вижу: JOBS: 14066 Открываю диспетчер процессов: процесс с pid 14066 есть. Значение pid, естеств., каждый раз - разное.
Ответы
Ответ 1
ожидание завершения всех дочерних процессов осуществляется с помощью команды wait. перехват сигнала sigint (который передаётся процессу при нажатии ctrl+c) и завершение всех дочерних процессов неплохо описано, например здесь.
Комментариев нет:
Отправить комментарий