Bash SIGTERM信号处理混乱
我正在运行一个调用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时的行为吗?那就是继续被子进程阻止?然后才处理信号。信号处理过程不会被中断吗 父脚本中的信号处理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秒来完
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正在处理一些信息并将其写入文件