当前位置: 首页 > 知识库问答 >
问题:

信号处理混乱

吴缪文
2023-03-14

我正在运行一个调用shell脚本的程序(用于讨论带有pid 100的sh1)。该脚本依次调用另一个脚本(用于与pid 101的讨论sh2),并等待它完成。sh2(子脚本)完成大约需要50秒。

调用sh2的方式(/bin/sh2.sh)

在等待子进程完成期间,我尝试终止sh1(使用kill-15 100)。我在sh1中有一个处理程序函数来处理此信号。但是,我观察到我的sh1(父脚本)直到子进程完成其工作(50秒)并且只有在该信号被处理之后才会被终止。

我修改了我的子脚本,用了30秒来完成,我观察到在向sh1发出SIGTERM后,需要大约30秒来终止。

这是处理SIGTERM时的行为吗?即保持被子进程阻止?然后才处理该信号。信号处理过程不会被中断吗?

父脚本中的信号处理。

function clean_up()
{   
  //Do the cleanup
}

trap "clean_up $$; exit 0" TERM

共有1个答案

董洲
2023-03-14

如果sh1调用sh2并等待它完成,那么它不会运行信号陷阱,直到sh2完成。也就是说,如果这是sh1:

#!/bin/sh  
trap 'echo caught signal delayed' SIGTERM
sh2

然后sh1会捕捉信号,什么都不做,直到sh2完成,然后执行trap。如果希望陷阱在信号发送后立即触发,可以异步运行sh2并显式等待:

#!/bin/sh
trap 'echo caught signal' SIGTERM
sh2&
wait

不幸的是,这并没有重新进入等待。如果您需要继续等待,确实不可能做到可靠,但您可以接近:

#!/bin/sh
trap 'echo caught signal' SIGTERM
sh2&
(exit 129)   # prime the loop (eg, set $?) to simulate do/while
while test $? -gt 128; do wait; done

这是不可靠的,因为您无法区分自己捕获信号和sh2被信号终止之间的区别。如果您需要这是可靠的,您应该用一种允许更好地控制信号的语言重新编写sh1。

 类似资料:
  • 问题内容: 我只是在Mac OS X中玩信号。 为什么在我的信号处理程序完成后,以下代码为什么没有产生SIGSEGV的默认行为?在Linux下,代码可以正常工作。 编辑: 我得到的输出如下: 问题是我希望程序在输出之后终止,但是它永远运行了,我不得不中断它。 问题答案: 这实际上使我的大脑冻结了几分钟,而在今天和这个年龄段中永远不使用的原因在我体内变得越来越强大。 首先,从手册页 signal()

  • 信号 信号是一种进程间通信(IPC)机制,主要用于处理异步事件。 不同的Unix衍生版所支持的信号类型并不完全相同。除了支持POSIX规定的信号外,还支持其他信号。 术语解释 术语 解释 生成信号 发生了一个需要引起进程注意的事件而导致信号出现时。也叫发送信号 信号交付 被发送信号的那个进程识别到了信号并采取了适当动作。也叫接收信号 信号句柄 当信号出现时调用进行专门处理的函数。这个函数称为捕获函

  • 阻塞信号是保持该信号并推迟发送,直到阻塞解除,但不会丢失。 结构体sigset_t(信号集合) 其中每一位对应系统支持的一种信号。结构体内部是数组。 函数 函数名 描述 [[sigemptyset sigempty]] 初始化信号集为空集 [[sigfillset sigfillset]] 初始化信号集包含全部信号 [[sigaddset sigaddset]] 向信号集中添加信号 [[sigde

  • Linux常用31个信号(1~31)。signal.h中有个常量NSIG定义了信号的个数,其值通常为为64。 编号 信号 编号 信号 编号 信号 1 SIGHUP 2 SIGINT 3 SIGQUIT 4 SIGILL 5 SIGTRAP 6 SIGABRT 7 SIGBUS 8 SIGFPE 9 SIGKILL 10 SIGUSR1 11 SIGSEGV 12 SIGUSR2 13 SIGPIP

  • 有的时候我们希望Go能够智能地处理Unix信号。例如我们希望一个server接收到一个SIGTERM的信号时,能够自动地停止;或者一个命令行工具接收到一个SIGINT信号时,能够停止接收输入。现在我们来看下如何使用channel来处理信号。 package main import "fmt" import "os" import "os/signal" import "syscall" func

  • 信号处理器会监听 Worker 进程和 自定义 进程启动后,自动注册到信号管理器中。 安装 composer require hyperf/signal 发布配置 您可以通过下面的命令来发布默认的配置文件到您的项目中: php bin/hyperf.php vendor:publish hyperf/signal 添加处理器 以下我们监听 Worker 进程的 SIGTERM 信号,当收到信号