Andreas Veithen , çağrıdan geri dönmeye gerek duymamanız durumunda (OP örneğinde olduğu gibi) yalnızca exec
komut aracılığıyla aramanın yeterli olduğunu ( @Stuart P. Bentley'in cevabı ) belirtmektedir . Aksi takdirde, "geleneksel" trap 'kill $CHILDPID' TERM
(@ cuonglm'in cevabı) bir başlangıçtır, ancak wait
çağrı aslında tuzak işleyicisi çalıştıktan sonra, çocuk işleminden önce hala devam etmeden önce geri döner. Bu nedenle, "ekstra" bir çağrı yapılması wait
önerilir ( @ user1463361'in cevabı ).
Bu bir gelişme olsa da, yine de bir yarış koşulu vardır ki bu, işlemin asla çıkamayacağı anlamına gelir (sinyalleyici TERM sinyali göndermeyi denemezse). Güvenlik açığı penceresi, tuzak işleyiciyi kaydetme ile çocuğun PID'sini kaydetme arasındadır.
Aşağıdaki, bu güvenlik açığını ortadan kaldırır (yeniden kullanım işlevlerinde paketlenmiştir).
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