Shell脚本使用Trap获得CTRL + Z.

时间:2013-11-24 23:26:32

标签: linux bash shell signals bash-trap

我试图在我的脚本trap中获取SIGSTOP CTRL + Z 信号。

当我的脚本执行时,如果我暂时暂停执行,发送SIGSTOP信号 CTRL + Z ,则需要删除我在其中创建的文件并终止执行。

我不明白为什么以下脚本不起作用。但更重要的是,正确的做法是什么?

#!/bin/bash

DIR="temp_folder"
trap "rm -r $DIR; kill -SIGINT $$" SIGSTP

if [ -d $DIR ]
then
    rm -r $DIR
else
    mkdir $DIR
fi
sleep 5

修改

SIGSTOP无法被捕获,但是SIGTSTP可以被捕获,并且根据我在searching on the internet之后理解的内容和下面的答案,当使用 CTRL发送信号时捕获是正确的 + ž。但是,当我在运行脚本时按 CTRL + Z 时它会卡住,这意味着无论什么信号,脚本都会无限执行我事后发送。 enter image description here

2 个答案:

答案 0 :(得分:3)

有两个信号你不能trap *,SIGKILLSIGSTOP。使用另一个信号。

*:不修改内核

IEEE standard

  

为SIGKILL或SIGSTOP设置陷阱会产生不确定的结果。

答案 1 :(得分:2)

这里的问题是你试图暂停已经睡觉的进程。

在shell脚本中使用DIR=$(mktemp -d)来创建临时目录也是一种好习惯。

CTRL - C 是信号(2)/ CTRL - Z ({{ 1}}):

20

如果将函数发送到后台(例如游标微调器) - 则需要在长进程运行时禁用 CTRL - Z

catch_exits() {
        printf "\n$(basename $0): exiting\n" 1>&2
        rm -rf $DIR
        exit 1
}

trap catch_exits 1 2 3 15 20

DIR="$(mktemp -d)"
read -p "not sleeping" test