【问题标题】:Bash subshell trap not working when parent interrupted [duplicate]当父级中断时,Bash subshel​​l 陷阱不起作用[重复]
【发布时间】:2017-11-01 07:34:03
【问题描述】:

我有以下脚本 s2:

#!/bin/bash
trap 't' INT
function t() {
        echo "trap"
}
sleep 999

那我打电话给s1:

#!/bin/bash
./s2 &
wait

所以 s1 等待 s2 休眠。 现在,当我按 Ctrl+C 时,它不会在 s2 中打印陷阱消息。这是为什么呢?

此外,如果在 s1 中,您在使用 INT 信号启动 s2 后显式杀死它,它仍然不会调用中断。

#!/bin/bash
./s2 &
pid=$!
kill -INT $pid
wait # waits for s2 instead of killing it right away

为什么?

【问题讨论】:

  • Ctrl-C 正在杀死前台进程组,而不仅仅是进程。 Bash 等待sleep 退出,因为它假设这个进程也有每个人的信号,它正在等待看它是否被处理

标签: bash shell


【解决方案1】:

这里有两个问题。我不确定第二个问题的答案,但我可以告诉你第一个示例中发生了什么。

  1. 你启动 s1
  2. s2 由 s1 启动
  3. s1 正在等待 s2
  4. 你杀了 s1
  5. s2 仍在运行

您可以通过检查正在运行的进程来确认这一点。

你的第二个例子对我来说有点奇怪。如果我弄明白了,我会更新我的答案。

【讨论】:

  • 不,实际上我尝试简化我遇到的问题,但我的简化是错误的。这不会打印消息,因为它创建了一个我们无法查看的独特外壳。它没有杀死它的原因是我没有在陷阱中设置出口。我的问题比较复杂。我在第二个脚本中有一个 ssh 远程调用,由于某种原因,陷阱没有杀死,我试图找出原因。我会重新发布我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多