关注Interrupt sleep in bash with a signal trap,我运行代码:
org.eclipse.jetty.server.HttpChannel : /some/api/example
org.eclipse.jetty.io.EofException: null
at org.eclipse.jetty.server.HttpConnection$SendCallback.reset(HttpConnection.java:677) ~[jetty-server-9.4.7.v20170914.jar:9.4.7.v20170914]
at org.eclipse.jetty.server.HttpConnection$SendCallback.access$300(HttpConnection.java:641) ~[jetty-server-9.4.7.v20170914.jar:9.4.7.v20170914]
at org.eclipse.jetty.server.HttpConnection.send(HttpConnection.java:521) [jetty-server-9.4.7.v20170914.jar:9.4.7.v20170914]
at org.eclipse.jetty.server.HttpChannel.sendResponse(HttpChannel.java:730) ~[jetty-server-9.4.7.v20170914.jar:9.4.7.v20170914]
at org.eclipse.jetty.server.HttpChannel.write(HttpChannel.java:786) ~[jetty-server-9.4.7.v20170914.jar:9.4.7.v20170914]
at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:234) ~[jetty-server-9.4.7.v20170914.jar:9.4.7.v20170914]
at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:218) ~[jetty-server-9.4.7.v20170914.jar:9.4.7.v20170914]
at org.eclipse.jetty.server.HttpOutput.flush(HttpOutput.java:392) ~[jetty-server-9.4.7.v20170914.jar:9.4.7.v20170914]
at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1054) ~[jackson-core-2.8.10.jar:2.8.10]
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:953) ~[jackson-databind-2.8.10.jar:2.8.10]
信号陷阱有效,但守护进程会进入无限循环的下一次迭代,即使睡眠尚未结束。
然后我修改while循环内部代码如下(添加第二个wait命令):
trap "echo 'Doing something'" SIGUSR1
echo "$$" > .daemon.pid
while true
do
echo "in loop"
sleep 60 &
wait $!
done
在这种情况下,我可以在守护进程到下一次迭代之前发送2个陷阱命令,即使睡眠没有结束也是如此。
是否有可能强制守护进程在陷阱后恢复休眠状态,以便在休眠执行结束前不进入下一次迭代,无论发送的信号数量是多少?
编辑:丑陋的回答
我找到了一个丑陋的答案。我还在等待一个更好的答案,可能不那么难看:)代码的魅力......
while true
do
echo "in loop"
sleep 60 &
wait $!
wait $!
done
答案 0 :(得分:1)
是否可以强制守护程序在陷阱后恢复睡眠……
实际上,sleep
不能被恢复 ,因为它甚至没有被中断-只有wait
被中断。
我仍在等待更好的答案,而这个答案可能不太丑陋……
丑陋是一种品味问题,丑陋程度不及
while ! wait $!
do
continue
done
一个可能找到
until wait $!; do :; done
或者只是
until wait; do :; done
(如果当前没有其他活动的子进程)。