当收到信号时,我可以使用trap执行一些命令.例子:

trap 'echo hello world' 1 2

如果接收到任何指定的信号,将显示"hello world".

但是如何打印/识别接收到的信号名称?

推荐答案

(如果您只有一个信号的号码,并且想要一个名称,那么kill -l $SIGNAL_NUM会打印一个信号的名称;您可以在拨打trap的电话中使用信号名称而不是数字来避免这种情况,如下所示.)

This answer表示无法访问信号名,但如果您对捕获的每个信号都有单独的函数,则您已经知道信号名:

trap 'echo trapped the HUP signal' HUP
trap 'echo different trap for the INT signal' INT

在许多情况下,这可能就足够了,但another answer on that same question利用这一事实提供了一个变通方法,来伪造你想要的行为.它接受一个函数和一个信号列表,并为使用信号名调用的函数上的每个信号设置一个单独的trap ,因此在内部,它实际上是每个信号的一个单独函数,但它看起来像是单个函数上的一个trap ,将信号名作为参数:

代码:

#!/bin/bash

trap_with_arg() {
    func="$1" ; shift
    for sig ; do
        trap "$func $sig" "$sig"
    done
}

func_trap() {
    echo "Trapped: $1"
}

trap_with_arg func_trap INT TERM EXIT

echo "Send signals to PID $$ and type [enter] when done."
read # Wait so the script doesn't exit.

如果我运行它,那么我可以向进程发送信号,然后得到如下输出

Trapped: INT
Trapped: TERM
Trapped: EXIT

Linux相关问答推荐

Linux x86_64上PIE ELF可执行文件的.Text段的基本虚拟地址

Flutter 构建错误:';DART:JS_interop';在此平台上不可用

使用 YASM 程序集时如何更改 64 位 Linux 中的终端 colored颜色 ?

如何过滤 Bash 的正则表达式(Linux)中的所有值,除了一个?

如何删除文件中不需要的字符(使用 shell 脚本)

我有 ext2 格式的文件系统图像.我喜欢在终端中读取 Linux 特别是 Ubuntu 中的所有文件系统 struct 数据.有没有工具>

我应该如何从非 root Debian Linux 守护进程登录?

并行制作:将 -j8 设置为默认选项

隐藏文件 .env 未使用 Docker COPY 复制

什么是最有效的不区分大小写的 grep 用法?

Vagrant chicken-and-egg:与 uid = apache 用户共享文件夹

如何将输出从 grep 传送到 cp?

在 Ubuntu 中重启 Nginx

为什么 mmap() 比顺序 IO 快?

从linux命令行写入串口

如何使用文件描述符刷新写入?

用于 ssh 的类似 teamviewer 的工具?

zsh:找不到命令 laravel

如何在 Linux 中删除早于特定日期的文件?

获取本地时区的 Olson TZ 名称?