我有一个想要监视另一个程序的Bourne
shell(/ bin / sh)脚本(为了便携性).它应该启动另一个程序,然后等待它退出.当第二个程序退出时,它会做一些最后的工作并退出.问题在于脚本需要响应信号(例如USR2)并在信号出现时做一些工作.
原文链接:https://www.f2er.com/bash/384833.html我的天真实施是:
#! /bin/sh echo $$ trap 'echo Respond to USR2' USR2 /bin/sleep 120 & pid=$! wait $pid echo $pid exited with $? echo Doing final cleanup
这不起作用.如果我发送了外壳SIGUSR2,则陷阱会按预期触发,但是等待也会完成,返回140. / bin / sleep继续以其快乐的方式进行.典型输出:
28849 Respond to USR2 28850 exited with 140 Doing final cleanup
这个行为在dash和bash之间是一致的,我可以方便地访问两个Bourne shell派生物.
我目前的工作是旋转循环等待子PID消失,用kill进行探测.自旋循环似乎很浪费,并且扩大了窗口,如果PID被快速重用,我的脚本可能会错误地等待错误的进程.
#! /bin/sh echo $$ trap 'echo Respond to USR2' USR2 /bin/sleep 15 & pid=$! while /bin/kill -0 $pid 2> /dev/null; do echo waiting... sleep 2 done echo Doing final cleanup