Выполнять команду или функцию, когда SIGINT или SIGTERM отправляются самому родительскому скрипту, а не дочерним процессам

У меня возникла аналогичная проблема с моей настройкой на OUYA. У меня есть окно входа в систему SLIM с Xfce4, и у меня также есть SSH. Я нашел файл MIT-MAGIC-COOKIE (/var/run/slim.auth) и смог подключиться к дисплею сразу после выполнения команды в SSH. У меня сработала команда:

    x11vnc -auth /var/run/slim.auth

Надеюсь, это даст результат, который вы искали.

10
01.10.2016, 18:20
1 ответ

trap сама реагирует на сигналы вызывающего процесса. Но вы должны вызвать его до того, как будет получен сигнал. Я имею в виду, в начале вашего сценария.

Кроме того, если вы хотите использовать kill - - $$ , который также отправляет сигнал вашему скрипту, вам необходимо очистить ловушку перед запуском kill, иначе вы закончите с бесконечным kill && trap цикл.

Например:

#!/bin/bash
exit_script() {
    echo "Printing something special!"
    echo "Maybe executing other commands!"
    trap - SIGINT SIGTERM # clear the trap
    kill -- -$$ # Sends SIGTERM to child/sub processes
}

trap exit_script SIGINT SIGTERM

echo "Some other text"
#other commands here
sleep infinity

Как объясняется в комментариях, проблема в том, что сценарий получает сигнал, но ожидает завершения программы ожидания перед обработкой принятого сигнала. Итак, вы должны убить дочерние процессы (в данном случае процесс сна), чтобы запустить действие ловушки. Вы можете сделать это примерно так:

kill -- -$(pgrep script.sh)

Или как указано в комментариях:

killall -g script.sh
16
27.01.2020, 20:01

Теги

Похожие вопросы