【发布时间】:2018-10-09 14:47:34
【问题描述】:
在 bash 脚本中,我设置了两个陷阱:一个用于 TERM 信号,一个用于 ERR 信号。
当我向脚本发送 TERM 信号时,它会执行 ERR 陷阱,而不是 TERM 陷阱。
我在两台电脑上试过。其中之一是 Ubuntu 14.04.5 LTS,脚本运行良好。在另一个。 Scientific Linux 7.3 (Nitrogen),出现错误。
以下是脚本:
#!/bin/bash
trap "echo caught signal SIGTERM; exit 1;" SIGTERM
trap "echo caught signal SIGINT; exit 1;" SIGINT
trap "echo caught signal ERR; exit 1;" ERR
set -e
sleep 50
echo grep with err
grep sasas sasasa
当我在脚本 PID 上执行 kill -TERM -PID 时,我得到以下信息:
Terminated
caught signal ERR
如果sleep 命令结束,我会得到以下信息:
grep with err
grep: sasasa: No such file or directory
caught signal ERR
可能是什么问题?如何强制对 SIGTERM 信号执行 TERM 陷阱?
谢谢
【问题讨论】:
-
您好,欢迎来到 Stack Overflow。我刚刚在 git-bash 中尝试过,以
./script.sh &的方式运行它按预期工作,我得到了caught signal SIGTERM。你如何运行脚本? -
谢谢。堆栈溢出已经为所有事情提供了大部分答案。这很棒。我完全按照你的方式执行它。在两个 Linux 机器上尝试过。我刚刚用 git-bash 进行了测试,它可以工作。会不会是我的系统管理员设置的某种全局设置?
-
刚刚检查过。在测试的三个 bash 版本中,有效的是 2013 年的 4.3.11(1) 和 2016 年的 4.4.12(1)。不起作用的是 2011 年的 4.2.46(1)。知道这是否是问题所在?
-
应该是因为你刚刚测试过:-)
-
出于好奇,你能不能试试这个unix.stackexchange.com/a/314556 那个没用的?