Linux sh trap SIGINT失败,但trap SIGQUIT成功
我想捕获CtrL+c和CtrL+\,然后将下面的cmd添加到我的脚本中:Linux sh trap SIGINT失败,但trap SIGQUIT成功,linux,shell,signals,Linux,Shell,Signals,我想捕获CtrL+c和CtrL+\,然后将下面的cmd添加到我的脚本中: trap _trapException SIGINT SIGQUIT function _trapException(){ echo "The job is canceled!" exit } 但是,这可以捕获CtrL+\但不能捕获CtrL+c, 我删除了SIGQUIT,它仍然不能捕获CtrL+c 否则,我同时在脚本中使用了tee函数。处理程序函数和陷阱调用都很好。当您第一次提出SIGINT或SIGQUIT时,将
trap _trapException SIGINT SIGQUIT
function _trapException(){
echo "The job is canceled!"
exit
}
但是,这可以捕获CtrL+\但不能捕获CtrL+c,
我删除了SIGQUIT,它仍然不能捕获CtrL+c
否则,我同时在脚本中使用了tee函数。处理程序函数和陷阱调用都很好。当您第一次提出
SIGINT
或SIGQUIT
时,将调用该函数。但是,在信号处理程序中,您也在调用exit
。这意味着这将扼杀整个过程
尝试从函数
\u trapException中删除exit
调用。Blue Moon当我重写演示代码以重现它时,我发现了问题的原因。演示如下:
test.sh
虽然trap_test.sh也有一个trap函数,但该函数如下所示:
#!/bin/shell
trap test SIGINT SIGQUIT
function test(){
echo "trap test!"
exit 1
}
while true
do
echo "test"
sleep 10
done
当我运行sh test.sh时,trap CtrL+c失败,但是trap CtrL+\success;
当我删除trap_test.sh中的trap代码时,它可以在运行sh test.sh时捕获这两个信号
深层次原因仍然未知?我不明白为什么在删除退出后它不起作用。你能发一个简短的代码来重现这个问题吗?对不起,输入框太小了,我在下面添加了描述。您是如何在几分之一秒内向程序发送信号的?您从test.sh
调用exit
,它将被杀死。您从命令行发送的任何信号都将被test.sh
接收。我无法重现你的问题。你的sh
?GNUBash(bdsh),版本3.00.22(2)-发行版(x86_64-redhat-linux-GNU)我更新trap_test.sh(全部内容)和test.sh,然后你可以再次运行它们,演示只是为了显示问题,我真正的脚本可能有这样的错误,我删除了trap
标记,因为它没有描述shell的trap
,而是描述了其他东西。
#!/bin/shell
trap test SIGINT SIGQUIT
function test(){
echo "trap test!"
exit 1
}
while true
do
echo "test"
sleep 10
done