Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash SIGTERM信号处理混乱_Bash_Shell_Signals_Sigterm - Fatal编程技术网

Bash SIGTERM信号处理混乱

Bash SIGTERM信号处理混乱,bash,shell,signals,sigterm,Bash,Shell,Signals,Sigterm,我正在运行一个调用shell脚本的程序(用于讨论带有pid 100的sh1)。 该脚本依次调用另一个脚本(用于讨论带有pid 101的sh2)并等待它完成。sh2(子脚本)大约需要50秒才能完成 调用sh2的方式(/bin/sh2.sh) 在等待child完成的过程中,我尝试终止sh1(使用kill-15100)。我在sh1中有一个处理函数来处理这个信号。然而,我观察到我的sh1(父脚本)在子脚本完成其工作(50秒)之前不会终止,并且只有在处理该信号之后才会终止 我修改了我的子脚本,用30秒来完

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

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

在等待child完成的过程中,我尝试终止sh1(使用kill-15100)。我在sh1中有一个处理函数来处理这个信号。然而,我观察到我的sh1(父脚本)在子脚本完成其工作(50秒)之前不会终止,并且只有在处理该信号之后才会终止

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

这是处理SIGTERM时的行为吗?那就是继续被子进程阻止?然后才处理信号。信号处理过程不会被中断吗

父脚本中的信号处理

function clean_up()
{   
  //Do the cleanup
}

trap "clean_up $$; exit 0" TERM

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

#!/bin/sh  
trap 'echo caught signal delayed' SIGTERM
sh2
然后,sh1将捕获信号,在sh2完成之前不执行任何操作,然后它将执行陷阱。如果希望陷阱在信号发送后立即触发,可以异步运行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。

当您向父级发送信号时,sh2在做什么?sh2正在处理一些信息并将其写入文件