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

Я хочу создать 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}