4

我正在尝试在我的脚本中获取 SIGSTOP CTRL+信号。Ztrap

当我的脚本正在执行时,如果我暂时暂停执行,发送一个 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可以被困,根据我在互联网上搜索CTRL后的理解以及下面的答案,使用+发送信号时陷阱是正确的Z。但是,当我在运行脚本时按CTRL+时,它会卡住,这意味着无论我之后发送什么信号,脚本都会无休止地执行。 Z在此处输入图像描述

4

2 回答 2

3

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

*:不修改内核

IEEE标准

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

于 2013-11-24T23:44:35.833 回答
3

这里的问题是你试图暂停一个已经在休眠的进程。

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

CTRL-C是信号 ( 2) / CTRL- Z( 20):

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

如果您将功能发送到后台(例如光标微调器) - 那么您需要禁用CTRL-Z而长进程正在运行:

trap "" SIGTSTP
于 2017-04-10T16:24:37.910 回答