С помощью zsh
:
pids=()
trap '
trap - CHLD
(($#pids)) && kill $pids 2> /dev/null
' CHLD
sleep 2 & pids+=$!
sleep 1 & pids+=$!
sleep 3 & pids+=$!
wait
(здесь используется sleep
в качестве тестовых команд).
При использовании bash
ловушка CHLD запускается только при включенной опции m
. Вы не хотите запускать свои задания в соответствии с этой опцией, поскольку это приведет к их запуску в отдельных группах процессов. Также обратите внимание, что сброс обработчика внутри обработчика, похоже, не работает с bash. Таким образом, эквивалент bash
будет выглядеть примерно так:
pids=()
gotsigchld=false
trap '
if ! "$gotsigchld"; then
gotsigchld=true
((${#pids[@]})) && kill "${pids[@]}" 2> /dev/null
fi
' CHLD
sleep 2 & pids+=("$!")
sleep 1 & pids+=("$!")
sleep 3 & pids+=("$!")
set -m
wait
set +m
Я обнаружил, что мне нужно добавить косую черту после идентификатора раздела -, например.ls (hd1,gpt7)/