сценарий оболочки с перехваченным сигналом не игнорирует сигнал - PullRequest
0 голосов
/ 05 февраля 2020

Я работаю над системой автоматизации тестирования и придумываю плохо себя ведущие программы. С первым я уже столкнулся с неожиданным поведением.

    trap "echo No thanks" INT                            

    echo Let me just chill for $1 sec  
    sleep $1                                     
    echo All finished

Наблюдаемое поведение:

  • отправка SIGINT приводит к выводу «Нет, спасибо», сон, по-видимому, прерывается немедленно и сразу же после этого печатается «Все закончено». Поведение
  • одинаково, независимо от того, передается ли сигнал отдельно или выполняется с клавиатуры ctrl + c.
  • То же поведение наблюдается, если сон является фоновым, и мы wait для него.

Ожидаемое поведение:

  • отправка SIGINT процессу должна привести в «Нет, спасибо» будет печататься до тех пор, пока выполняется сон, а затем «Все закончено» будет напечатано до выхода, после того, как сон завершится.
  • Если сон заземлен, выдается клавиатура ctrl + c должен отправить SIGINT в группу процессов, которая будет включать спящий режим, так что он должен преждевременно остановить его. Я не уверен, чего ожидать

Вопросы:

  • Как я могу получить желаемое поведение?
  • Почему именно он ведет себя так (отличается от моих ожиданий)?

Вопрос, по сути, является обманом this , но нет удовлетворительных объяснений в этот ответ.

1 Ответ

2 голосов
/ 05 февраля 2020

В настоящее время:

  1. bash ожидает sleep для выхода
  2. bash и sleep получения sigint
  3. sleep умирает
  4. bash заканчивает ожидание и запускает ловушку

Это предотвращает ваше желаемое поведение, потому что:

  • Вы не хотели sleep для d ie
  • Вы не хотели, чтобы bash ждал завершения команды, прежде чем запускать ловушку

Чтобы исправить это, вы можете sleep проигнорировать знак и bash запустите wait в al oop, чтобы основной сценарий получил управление после ctrl- c, но все еще ожидает завершения sleep:

trap 'echo "No thanks"' INT
echo "Let me just chill for $1 sec"
# Run sleep in the background
sleep "$1" &
# Loop until we've successfully waited for all processes
until wait; do true; done
echo "All finished"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...