POSIX sh não é muito bom em lidar com vários processos em segundo plano. A ferramenta básica é o wait
builtin, que bloqueia até que um processo de segundo plano saia. Mas wait
sem argumento aguarda até que todos processos em segundo plano tenham saído e retorne o status de saída do último processo que saiu; o status de saída dos outros subprocessos é perdido.
Você pode definir uma armadilha para SIGCHLD, que é o sinal que é gerado quando o filho de um processo sai. Isso executa o código sempre que um subprocesso é encerrado. No entanto, você não precisa necessariamente saber qual subprocesso saiu ou qual é o status de retorno. Diferentes cartuchos se comportam de maneira diferente.
ATT ksh93 (não mksh ou pdksh!) é o único entre os shells comuns que se comportam utilmente com os traps SIGCHLD. Ele define $!
para o PID do processo que saiu e $?
para o status de retorno.
#!/bin/ksh
trap 'Process $! (${subprocesses[$!]}) exited with status $?' CHLD
typeset -A subprocesses
program1 & subprocesses[$!]='program1'
program2 & subprocesses[$!]='program2'
wait
Se você usar outro shell, coloque qualquer pós-tratamento no subprocesso.
#!/bin/sh
{ program1; echo "program1 exited with status $?"; } &
{ program2; echo "program2 exited with status $?"; } &
wait
Ou use uma linguagem mais capaz, como Perl, Python, Ruby, etc.