скрипт оболочки с захваченным сигналом не игнорирует сигнал

скрипт оболочки с захваченным сигналом не игнорирует сигнал

05.02.2020 08:16:58 Просмотров 35 Источник

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

    trap "echo No thanks" INT                            

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

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

  • отправка SIGINT приводит к тому, что" нет спасибо "печатается, сон, по-видимому, немедленно прерывается и" все готово " также печатается сразу после этого.
  • поведение одинаково независимо от того, посылается ли сигнал отдельно или выполняется с помощью клавиатуры ctrl+C.
  • такое же поведение наблюдается, если сон имеет под собой почву и мы ждем его.

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

  • отправка SIGINT в процесс должна привести к тому, что "No thanks" будет печататься до тех пор, пока спящий режим работает, а затем "All finished" будет напечатан перед выходом, после завершения сна.
  • Если спящий режим является фоновым, выдача клавиатуры ctrl+c должна отправить SIGINT в группу процессов, которая будет включать спящий режим, так что следует остановить его преждевременно. Я не знаю, чего ожидать.

Вопросы:

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

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

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/60080944/shell-script-with-trapped-signal-does-not-ignore-signal#comment106260556_60080944
@Matthieu пожалуйста, перечитайте вопрос, смысл в том, чтобы он не выходил, но он выходит неожиданно
https://stackoverflow.com/questions/60080944/shell-script-with-trapped-signal-does-not-ignore-signal#comment106260973_60080944
Работает на меня без проблем, как вы и ожидали. Вы можете показать мне, как вы генерируете СИГИНТ?
https://stackoverflow.com/questions/60080944/shell-script-with-trapped-signal-does-not-ignore-signal#comment106261311_60080944
Ваше ожидание неверно-обработчик ловушек будет запущен после завершения переднего плана сна . Кроме того, возможно, ты убиваешь не того пида. Никто не может воспроизвести ваше поведение, о котором вы сообщили, и ответ ниже-для случая Ctrl-C, который, как вы говорите, вы не делаете. Можете ли вы показать нам, как именно то, что вы печатаете, чтобы узнать pid, чтобы убить, что вы видите, и точно то, что вы печатаете, как вы убиваете его?
https://stackoverflow.com/questions/60080944/shell-script-with-trapped-signal-does-not-ignore-signal#comment106261362_60080944
Сегодня что-то странное, потому что я почти уверен, что раньше убивал правильный pid, но теперь он ведет себя так, как вы сейчас докладываете. Наверное, раньше я убивал не того пида.

Ответы - скрипт оболочки с захваченным сигналом не игнорирует сигнал / shell script with trapped signal does not ignore signal

that other guy

05.02.2020 08:52:44

В настоящий момент:

  1. bashждетsleepуйдет.
  2. bashи sleepполучают сигинт
  3. sleep умирает
  4. bash заканчивает ждать и запускает ловушку

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

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

Чтобы исправить это, вы можете заставить sleepигнорировать sigint, и заставить bashвыполнить waitв цикле, так что основной сценарий получает обратно управление после 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"
https://stackoverflow.com/questions/60080944/shell-script-with-trapped-signal-does-not-ignore-signal/60081468#comment106261266_60081468
Ловушки не наследуются подрешетками. Просто sleep $1 &. Feel free to remove it and try-работает одинаково С и без.
https://stackoverflow.com/questions/60080944/shell-script-with-trapped-signal-does-not-ignore-signal/60081468#comment106261427_60081468
Och, разница может быть в зависимости от того, находится ли фоновый процесс в той же группе процессов и также получает sigint.
https://stackoverflow.com/questions/60080944/shell-script-with-trapped-signal-does-not-ignore-signal/60081468#comment106261432_60081468
Ловушка заставляет подрешетку игнорировать SIGINT, но вам не нужно выполнять exec в подрешетке. sleep, будучи backgrounded, не получает SIGINT (не знаю почему, но я думаю, что backgrounding задание перемещает его из текущей группы процессов).
https://stackoverflow.com/questions/60080944/shell-script-with-trapped-signal-does-not-ignore-signal/60081468#comment106261539_60081468
Этот код ведет себя так, как я хочу. он немедленно запускает ловушку после получения сигнала. Теперь, если бы только можно было объяснить, почему ожидание прерывается сигналом. Я думаю, что объяснение где-то здесь: cons.org/cracauer/sigint.html
https://stackoverflow.com/questions/60080944/shell-script-with-trapped-signal-does-not-ignore-signal/60081468#comment106261624_60081468
@StevenLu я не уверен, какое объяснение вы ищете. wait, это Баш построен, и вы посылаете Баш сигинт.
https://stackoverflow.com/questions/60080944/shell-script-with-trapped-signal-does-not-ignore-signal/60081468#comment106261781_60081468
Из pubs.opengroup.org/onlinepubs/9699919799/utilities/... " когда оболочка ожидает с помощью утилиты wait завершения выполнения асинхронных команд, прием сигнала, для которого была установлена ловушка, должен вызвать немедленное возвращение утилиты wait со статусом выхода >128, сразу же после чего ловушка, связанная с этим сигналом, должна быть взята."
Закрыть X