当收到一个信号,我可以使用trap
执行一些命令。 例:
trap 'echo hello world' 1 2
如果收到任何指定的信号,则显示“hello world”。
但是,如何打印/识别接收到的信号名称?
(如果你只有一个信号的号码并且想要这个名字, 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
在陷阱内(通过信号触发),$? 变量最初设置为信号数加128,所以您可以通过将陷阱动作的第一个语句设置为类似于
sig=$(($? - 128))
然后可以使用kill命令获取信号的名称
kill -l $sig