LINUX.ORG.RU

Разная разница в поведении SIGINT в скрипте

 ,


0

5

Лорчик, я тут заметил неведомую хрень. И теперь не знаю что с ней делать, то ли с собой.

Короче, есть скрипт, который внутри себя запускает другую прогу. И ждет ее завершения. Работа проги бесконечна как морская гладь и одиночество Кипелова. Вот, да.

И поэтому надо бы при завершении скрипта все это дело прибить. Я уже научился отлавливать сигналы в скрипте через trap. В общем-то все получилось, но хочется разобраться с одной непоняткой.

Если запустить скрипт и прибить его по CTRL + C, то дочерний процесс отлично прибивается и без всякого трапа.

А вот если запущенному скрипту послать SIGINT c другого терминала, то скрипт завершается, но дочерний процесс не прибивается сам по себе.

Почему оно так?

Перемещено leave из talks

★★★★★

man bash:

To facilitate the implementation of the user interface to job control, the operating system maintains the notion of a current terminal process group ID. Members of this process group (processes whose process group ID is equal to the current terminal process group ID) receive keyboard-generated signals such as SIGINT.

А когда ты из другого терминала посылаешь SIGINT скрипту шеллу, исполняющему скрипт, то сигнал получает только сам шелл.

debugger ★★★★★
()
Ответ на: комментарий от hibou

Рассылка не детям а группе у которой этот терминал основной вне зависимости от их parent-child иерархии.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от hibou
$man kill
...
ARGUMENTS
...
    -1
         All processes with a PID larger than 1 are signaled.

    -n
         where n is larger than 1. All processes in process group n are signaled. When an argument of the form '-n' is given, and it is meant to denote a process group, either a signal must be specified
               first, or the argument must be preceded by a '--' option, otherwise it will be taken as the signal to send.

anonymous
()
Ответ на: комментарий от firkax

Из скрипта можно это все проделать? Создать свою собственную группу, как бы скрипт не запускался, всех прибить в группе потом, по выходу.

Просто я могу когда скрипт запускается в терминале, действительно послать всей группе скрипта сигнал завершения.

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

Если бы могли из скрипта создать свою группу, это было бы более универсально.

hibou ★★★★★
() автор топика
Ответ на: комментарий от hibou

Сделай обёртку на Си которая создаёт группу, запускает скрипт, ждёт пока он закончится и шлёт SIGINT группе (только самой обёртке SIGINT заигнорь а то не знаю как она отработает если сама себе его отправит).

firkax ★★★★★
()