LINUX.ORG.RU

Прерывание выполнения скрипта по Ctrl+C работает, а с kill -SIGINT - нет. Почему?

 , , ,


0

1

Привет, ЛОР.

Я написал скрипт, который имеет обработку прерывания по Ctrl+C вот таким образом:

# SigINT handling to cleaunp on "Crtl + C" command
trap 'killall stunnel && rm -f /tmp/sslconn.log && exit 0' INT

То есть, убивает все тоннели stunnel и удаляет файл временных логов sslconn.log.

Если я нажимаю Ctrl+C в консоли, где работает скрипт в режиме foreground, то trap отрабатывает как надо, туннели убиваются, файл удаляется.

А вот есть я из другой консоли отправляю команду kill с нужным PID-ом:

kill -SIGINT $pid
то ничего не происходит, скрипт продолжает работать. То же самое, если слать SIGINT через htop.

Что я делаю не так? Как мне прекращать работу скрипта с помощью команды?

Мне нужно это для того, чтобы останавливать работу скрипта, когда его останавливает мой сервис по команде

service mytunnel stop
Секции «start» и «stop» в /etc/init.d/mytunnel выглядят так:
start() {
    /etc/mytunnel/mytunnel.sh &
    pid=$!
    echo $pid > /tmp/run/mytunnel.pid
}

stop() {
    if [ -f "/tmp/run/mytunnel.pid" ]; then
        pid=$(cat /tmp/run/mytunnel.pid)
        kill -SIGINT $pid
    fi
}

UPD. Заметил такую особенность. Если пробовать завершить процесс mytunnel.sh с помощью команды kill -SIGTERM, ничего не происходит. Но, если с помощью этой же команды завершить chils-процесс «sleep», то mytunnel.sh обрабатывает SIGTERM и выходит корректно.

Получается, что sleep как-то блокирует trap?



Последнее исправление: Netman (всего исправлений: 3)

Сам спросил, сам нашёл ответ. Bash ждёт выполнения sleep, а потом процессит сигнал.

Для решения этой проблемы нужно использовать sleep вот так:

sleep 10 & wait $!

Netman
() автор топика

Наверно не туда шлёшь SIGINT. Ctrl-C его шлёт всей сессии а не только одному процессу.

chils-процесс «sleep»

А, ну наверно скрипт ждёт завершения sleep, а посколько sleep-у ты SIGINT (в отличие от Ctrl-C) не послал, то скрипт всё так же его ждёт.

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

Не понял что ты хотел сказать. Если ты имел ввиду, что Ctrl-C шлёт SIGINT лидеру - то нет. Он шлёт его всем foreground процессам которые есть в этом терминале. Если вызовешь 10 скриптов друг из друга (без &), в последнем запустишь sleep и нажмёшь ctrl-c то сигнал придёт всем.

firkax ★★★★★
()