Доброго всем времени суток.
Вопрос также по сабжу.
Задача: запускать скриптом n параллельных процессов (не суть важно каких, в примерах слипы) на рандомное время каждый. Скрипт должен по завершению одного из процессов запускать такой же. При подаче сигнала на управляющий скрипт, он должен грохать все запущенные процессы. Использование job-cоntrols.
Проблемы:
1) отслеживание завершения дочерних процессов. Не ловит trap CHLD внутри скрипта.
2) встроенный kill не убивает дочерние процессы.
примерный текст:
Код: Выделить всё
#!/bin/bash
trap_chld ()
{
echo "Child procees is gone"
[кусок рестарта процесса]
}
trap_int
{
echo "Kill all child processes"
kill %1
sleep 1
... [например так, цикл с перечислением не меняет сути]
}
trap 'trap_chld' CHLD
trap 'trap-_int' INT
[кусок старта процессов]
( sleep 1000 & sleep $K && kill %1; echo "Killed 1" ) & # Запуск в фоне в сабшелле, K - рандомное число
while :
do
sleep 1
done
трап на INT работает отлично, но kill %1 не убивает слип на 1000, а делает его сиротой
трап на CHLD не работает вообще
если ставить трап на Сtrl-Z, то вешает скрипт
более простой скрипт
Код: Выделить всё
#!/bin/bash
( sleep 10000 & sleep 40 && kill %1 ) &
sleep 30 && kill %1
jobs
ps -f
и в противовес обычная строка баша
( sleep 10000 & sleep 40 && kill %1 ) &
и команда после этого kill %1
результат в баше - убивается сабшелл и убиваются все слипы
результат в скрипте - убивается сабшелл (а сабшелл ли это, потому что в ps -f пишется имя скрипта), но все слипы, запущенные в фоне, живут, и становятся сиротами. естественно, результат нужен как в баше - все умерло.
буду очень благодарен за решение проблемы с объяснениями, а еще лучше за совет/линк на соответствующую литературу.