sh trap SIGINT失败,但陷阱SIGQUIT成功

时间:2015-06-30 17:13:40

标签: 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函数。

2 个答案:

答案 0 :(得分:0)

您的处理程序函数和陷阱调用很好。第一次引发SIGINTSIGQUIT时,将调用该函数。但是,在信号处理程序中,您还调用exit。这意味着它会杀死这个过程。

尝试从exit功能中删除_trapException来电。

答案 1 :(得分:0)

@Blue Moon当我重写一个演示代码来重现它时,我发现了导致问题的原因。演示如下: test.sh

#!/bin/sh
#encoding:UTF-8

trap _trapException SIGINT SIGQUIT
function _trapException(){
    echo "INFO: The job is canceled!"
    exit 1
}

sh trap_test.sh | tee -a test.log

虽然trap_test.sh也有陷阱功能,但功能如下:

#!/bin/shell
trap test SIGINT SIGQUIT
function test(){
    echo "trap test!"
    exit 1
 }

 while true
 do
    echo "test"
    sleep 10
 done

当我运行sh test.sh,然后陷阱CtrL + c失败,但是陷阱Ctrl + \ success; 当我删除trap_test.sh中的陷阱代码时,它可以在运行sh test.sh时捕获这两个信号。

深层原因还不得而知?