Я написал некоторый BASH-скрипт, показывающий счетчик, и заметил, что иногда после завершения фонового процесса и уничтожения счетчика, спящий процесс все еще выполнялся и задерживал обработку.Я сократил код до приведенного ниже:
#!/bin/bash
trap 'rm deleteme.fifo' EXIT
mkfifo deleteme.fifo
echo we are $$
bar() {
trap 'echo killing $sleep_pid from $$; kill $sleep_pid; wait $sleep_pid; echo exit subshell; exit' TERM
sleep 20 &
sleep_pid=$!
echo sleep is $sleep_pid
echo >deleteme.fifo
echo before wait
wait $sleep_pid
echo after wait
}
foo() {
bar &
bar_pid=$!
read <deleteme.fifo
kill $bar_pid && echo waiting for subshell to terminate && wait $bar_pid; echo returning
}
while true; do
foo &
wait $!
done
В bar
я настроил ловушку и начал 20-секундный сон, а затем уведомил родительский процесс, что мы готовы через именованный канал.Тогда я убиваю ребенка от foo
.Это часто работает, но иногда сон выживает и тянет вниз, пока остальные его ждут.Вот почему я добавил цикл для запуска поведения в конце концов.У кого-нибудь есть объяснение этому?
bash 4.4.12 (1), Linux 4.14.83, coreutils 8.29