-
Откройте терминал с именем "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:
замораживать?