-
Откройте терминал с именем "termA" и запустите созданный файл
callback.shс помощью/bin/bash callback.sh.cat callback.sh #!/bin/bash myCallback() { echo "callback function called at $(date)" } trap myCallback SIGUSR1 sleep 20 -
Откройте новый терминал с именем "termB" и запустите:
pkill -USR1 -f callback.sh
Что-то, как показано ниже, показано через 20 секунд в termA; он никогда не показывался в терминах А мгновенно:
callback function called at Mon Nov 19 08:21:52 HKT 2018
Вывод подтвердил, что, когда Bash выполняет внешнюю команду на переднем плане, он не обрабатывает никаких сигналов, полученных до завершения процесса переднего плана (см. Ловушку сигнала).
Сделайте небольшое изменение в callback.sh:
cat callback.sh
#!/bin/bash
myCallback() {
echo "callback function called at $(date)"
}
trap myCallback SIGUSR1
while true; do
read -p "please input something for foo: " foo
done
Добавьте бесконечный цикл while и снимите sleep 20.
-
Откройте терминал с именем "termA" и запустите созданный файл
callback.shс/bin/bash callback.sh; в первый раз информация всплывает мгновенно.please input something for foo: -
Откройте новый терминал с именем "termB" и запустите
pkill -USR1 -f callback.sh; в первый раз информация всплывает мгновенно в termA.callback function called at Mon Nov 19 09:07:14 HKT 2018
Проблема 1: callback.sh содержит бесконечный цикл while. Как это объясняет следующее?
он не обрабатывает сигналы, полученные до завершения процесса переднего плана
В этом случае процесс переднего плана никогда не заканчивается.
Продолжайте в termB, запустите pkill -USR1 -f callback.sh во второй раз.
callback function called at Mon Nov 19 09:07:14 HKT 2018
Информация выше всплывает мгновенно в termA снова.
Проблема 2: Нет, please input something for foo: показано в termA, перейдите к termB, запустите pkill -USR1 -f callback.sh в третий раз, следующая информация снова отображается в termA.
callback function called at Mon Nov 19 09:07:24 HKT 2018
По-прежнему не please input something for foo: показано в termA.
Почему информация please input something for foo: замораживать?
