Как запустить несколько дочерних процессов, которые будут автоматически получать сигналы, отправленные родителям
Я хочу создать Bash script для запуска параллельных дочерних процессов. Есть ли способ сделать это, чтобы дочерние скрипты по-прежнему получали сигналы, отправленные в родительский процесс?
Здесь примерно так, как я хочу запускать дочерние процессы, но это не соответствует моим критериям сигнализации.
for (( i=0; i<9; i++ ))
{
{ echo $i start ; sleep 5s ; echo $i complete ; } &
}
wait
Поскольку это работает автоматически в C-программе (которая использует fork/exec
), я считаю, что это должно быть возможно без использования trap
-фазовой пересылки сигналов, которая сама может быть прервана до того, как сигналы будут перенаправлены.
Обходным путем для этого является использование GNU-parallel
. Я не знаю, что это за механизм, но он решает эту проблему - до тех пор, пока вы готовы перестроить свои циклы в синтаксис стиля xargs
. GNU-parallel
не решает проблему, если используется опция --semaphore
.
Я думаю, что ответ здесь, но я не знаю, как его перевести на Bash: Сигнал, отправленный как дочернему, так и родительскому процессу.
Ответы
Ответ 1
Звучит так, как будто вы в порядке с GNU Parallel - просто не стиль xargs.
Можно ли использовать функции?
doit() {
# Trap 2 signals to show they are being given to the function
trap 'echo you hit Ctrl-C/Ctrl-\, now exiting..; exit' SIGINT SIGQUIT
echo $1 start
sleep 5s
echo $1 complete
}
export -f doit
seq 10 | parallel -u doit
или во избежание трубы:
parallel -u doit ::: {1..10}