信号陷阱在bash中引发下一个命令执行

时间:2017-12-21 10:05:57

标签: bash signals wait sleep

关注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

1 个答案:

答案 0 :(得分:1)

是否可以强制守护程序在陷阱后恢复睡眠……

实际上,sleep不能被恢复 ,因为它甚至没有被中断-只有wait被中断。

我仍在等待更好的答案,而这个答案可能不太丑陋……

丑陋是一种品味问题,丑陋程度不及

    while ! wait $!
    do
        continue
    done

一个可能找到

    until wait $!; do :; done

或者只是

    until wait; do :; done

(如果当前没有其他活动的子进程)。