Подтвердить что ты не робот

Идентификация имени принятого сигнала в Bash

Когда сигнал получен, я могу выполнить некоторые команды, используя trap. Пример:

trap 'echo hello world' 1 2

Если какой-либо из указанных сигналов получен, отображается мир приветствия.

Но как я могу распечатать/идентифицировать имя принятого сигнала?

4b9b3361

Ответ 1

(Если у вас есть только номер сигнала и требуется имя, kill -l $SIGNAL_NUM печатает имя сигнала, вы можете избежать этого, используя имена сигналов вместо номеров в своем обращении к trap, как показано ниже. )

В этом ответе говорится, что единственный способ определить, какой сигнал вы попали в bash, - это написать отдельную оболочку для каждого другого сигнала, который вы хотите захватить. Другой ответ на тот же вопрос предоставляет функцию обертки, чтобы сделать это для вас:

код:

#!/bin/bash

trap_with_arg() {
    func="$1" ; shift
    for sig ; do
        trap "$func $sig" "$sig"
    done
}

func_trap() {
    echo Trapped: $1
}

trap_with_arg func_trap INT TERM EXIT

read # Wait so the script doesn't exit.

Если я запустил это, тогда я могу отправить сигналы процессу, и я получаю вывод, например

Trapped: INT
Trapped: TERM
Trapped: EXIT

Ответ 2

В ловушке (при срабатывании через сигнал), $? переменная изначально устанавливается на номер сигнала плюс 128, поэтому вы можете назначить номер сигнала переменной, сделав первый оператор действия ловушки чем-то вроде

sig=$(($? - 128))

Затем вы можете получить имя сигнала с помощью команды kill

kill -l $sig