gpt4 book ai didi

bash - 重新启动期间未捕获 SIGTERM

转载 作者:行者123 更新时间:2023-12-04 18:31:28 26 4
gpt4 key购买 nike

$ cat SIGTERM 
#!/bin/bash
set -eu
flag_file=$(xdg-user-dir DESKTOP)/SIGTERM-TRAPPED
trap 'touch "$flag_file"' SIGTERM
sleep infinity

$ ./SIGTERM &

我关了电脑

I turned off the computer

开启后
$ test -f "$(xdg-user-dir DESKTOP)/SIGTERM-TRAPPED" || echo "File not found"
File not found

为什么 找不到文件 (从中可以理解 SIGTERM 没有被困)?

最佳答案

首先,像

rm -f test/SIGTERM-TRAPPED && ./SIGTERM  & sleep 0.2 && kill -TERM $! && sleep 0.5 && ls test

似乎比每次尝试都重新启动要方便得多。

现在, strace 既不显示 bash 也不显示 dash 运行陷阱,直到等待当前命令 ( sleep infinity ) 完成。

所以以流程为目标 SIGTERM导致 waitsleepEINTR 失败(shell 的处理程序运行,设置一个陷阱应该稍后运行的标志)和 shell wait再次。由于 child 永远不会完成, wait永远不会完成,并且延迟的处理程序永远不会运行。

针对 SIGTERM 的进程组( kill -TERM -$pid 而不是 kill -TERM $pid )会杀死 sleep child 也是如此,因此 shell 中的 wait 系统调用将停止循环,从而导致 shell 运行陷阱。
 rm -f test/SIGTERM-TRAPPED && ./SIGTERM  & sleep 0.2 && kill -TERM -$! && sleep 0.5 && ls test

我认为一个适当的应用程序应该在它终止时杀死它的 child 。

Shell 不这样做,而是依赖于进程组范围的杀戮( Ctrl+C/Ctrl-\ 针对整个前台进程组)或 SIGHUP s 在 session 结束时照顾他们离家出走的 child 。

关于bash - 重新启动期间未捕获 SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59685263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com