Ловушка ТЕРМИНА не надежно убивает фоновый процесс сна - PullRequest
0 голосов
/ 07 декабря 2018

Я написал некоторый 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

...