скрипт оболочки с захваченным сигналом не игнорирует сигнал
Я работаю над системой автоматизации тестирования, и я придумываю неправильные программы. С первым я уже сталкиваюсь с некоторым неожиданным поведением.
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 в группу процессов, которая будет включать спящий режим, так что следует остановить его преждевременно.Я не знаю, чего ожидать.
Вопросы:
- Как я могу получить желаемое поведение?
- Почему именно он ведет себя так (в отличие от моих ожиданий)?
Вопрос, по существу, является обманом этого, но в этом ответе нет удовлетворительных объяснений.
У вопроса есть решение - Посмотреть?

Источник

@Matthieu пожалуйста, перечитайте вопрос, смысл в том, чтобы он не выходил, но он выходит неожиданно
Источник

Работает на меня без проблем, как вы и ожидали. Вы можете показать мне, как вы генерируете СИГИНТ?
Источник

Источник

Источник

Ваше ожидание неверно-обработчик ловушек будет запущен после завершения переднего плана сна . Кроме того, возможно, ты убиваешь не того пида. Никто не может воспроизвести ваше поведение, о котором вы сообщили, и ответ ниже-для случая Ctrl-C, который, как вы говорите, вы не делаете. Можете ли вы показать нам, как именно то, что вы печатаете, чтобы узнать pid, чтобы убить, что вы видите, и точно то, что вы печатаете, как вы убиваете его?
Источник

Сегодня что-то странное, потому что я почти уверен, что раньше убивал правильный pid, но теперь он ведет себя так, как вы сейчас докладываете. Наверное, раньше я убивал не того пида.
Источник

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

05.02.2020 08:52:44
В настоящий момент:
bash
ждетsleep
уйдет.bash
иsleep
получают сигинтsleep
умирает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"

Ловушки не наследуются подрешетками. Просто
sleep $1 &
. Feel free to remove it and try
-работает одинаково С и без.

Och, разница может быть в зависимости от того, находится ли фоновый процесс в той же группе процессов и также получает sigint.

Ловушка заставляет подрешетку игнорировать SIGINT, но вам не нужно выполнять exec в подрешетке.
sleep
, будучи backgrounded, не получает SIGINT (не знаю почему, но я думаю, что backgrounding задание перемещает его из текущей группы процессов).

Этот код ведет себя так, как я хочу. он немедленно запускает ловушку после получения сигнала. Теперь, если бы только можно было объяснить, почему ожидание прерывается сигналом. Я думаю, что объяснение где-то здесь: cons.org/cracauer/sigint.html

@StevenLu я не уверен, какое объяснение вы ищете.
wait
, это Баш построен, и вы посылаете Баш сигинт.

Из pubs.opengroup.org/onlinepubs/9699919799/utilities/... " когда оболочка ожидает с помощью утилиты wait завершения выполнения асинхронных команд, прием сигнала, для которого была установлена ловушка, должен вызвать немедленное возвращение утилиты wait со статусом выхода >128, сразу же после чего ловушка, связанная с этим сигналом, должна быть взята."
Помочь в развитии проекта: