linux - Shell 脚本使用 Trap 获取 CTRL+Z

标签 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+Z 发送信号时捕获的正确答案。但是,当我在运行脚本时按 CTRL+Z 它会卡住,这意味着无论什么信号,脚本都会无休止地执行我之后发送。 enter image description here

最佳答案

这里的问题是您正试图挂起一个已经在休眠的进程。

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

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

关于linux - Shell 脚本使用 Trap 获取 CTRL+Z,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20182454/

相关文章:

linux - 内部变量 PIPESTATUS

linux - 通过 bash 脚本与多个目录中的文件交互

c++ - X11 窗口不会自动更新/绘图

android - 如何从 Linux 内核中找到处理核心的频率和利用率?

mysql - 在 webmin 中配置 mysql 和 apache2 模块

执行 dig -x 的 bash 脚本

linux - 如何使用node在Windows CMD中运行文件

linux - Shell 脚本 - 如何解压缩文件并通过 shell 脚本对其进行编辑?

c - Travis CI - 无法在 makefile 中运行 `c` 可执行文件

shell - 使用 find 和 xargs 以交互方式删除文件