Andreas Veithen ressalta que, se você não precisar retornar da chamada (como no exemplo do OP), basta chamar o exec
comando ( a resposta de @Stuart P. Bentley ) é suficiente . Caso contrário, o "tradicional" trap 'kill $CHILDPID' TERM
(resposta de @ cuonglm) é um começo, mas a wait
chamada realmente retorna depois que o manipulador de trap é executado, o que ainda pode acontecer antes que o processo filho realmente saia. Portanto, wait
é aconselhável uma chamada "extra" ( resposta do @ user1463361 ).
Embora isso seja uma melhoria, ele ainda possui uma condição de corrida, o que significa que o processo nunca pode sair (a menos que o sinalizador tente novamente enviar o sinal TERM). A janela de vulnerabilidade está entre o registro do manipulador de armadilhas e o registro do PID da criança.
A seguir, elimina essa vulnerabilidade (empacotada em funções para reutilização).
prep_term()
{
unset term_child_pid
unset term_kill_needed
trap 'handle_term' TERM INT
}
handle_term()
{
if [ "${term_child_pid}" ]; then
kill -TERM "${term_child_pid}" 2>/dev/null
else
term_kill_needed="yes"
fi
}
wait_term()
{
term_child_pid=$!
if [ "${term_kill_needed}" ]; then
kill -TERM "${term_child_pid}" 2>/dev/null
fi
wait ${term_child_pid}
trap - TERM INT
wait ${term_child_pid}
}
# EXAMPLE USAGE
prep_term
/bin/something &
wait_term