我在具有运行良好的打开jdk8的Ubuntu 15.04容器中运行Stardog 4.0。我想使用陷阱处理gracefully shutting down stardog

为了在容器中执行stardog以使其继续运行,我一直在使用以下效果很好的方法

$SBIN/bin/stardog-admin server start && (tail -f /storage/stardog.log &) && while (pidof java > /dev/null); do sleep 1; done

没有以下内容,容器将运行几秒钟并停止
&& (tail -f /storage/stardog.log &) && while (pidof java > /dev/null); do sleep 1; done

但是,这导致容器内有多个PID
root         1  0.0  0.0  18384  3236 ?        Ss   14:04   0:02 /bin/bash /stardog_binaries/startup.sh
root        45  0.1  4.9 4619052 406940 ?      Sl   14:04   0:10 java -Xms2g -Xmx2g -XX:MaxDirectMemorySize=4g -XX:SoftRefLRUPolicyMSPerMB=1 -XX:+UseParallelOldGC -XX:+UseCompressedOops -Djavax.xml.datatype.DatatypeFactory=org.apache.xerc
root        97  0.0  0.0   4412   740 ?        S    14:04   0:00 tail -f /storage/stardog.log
root     12108  0.2  0.0  18184  3100 ?        Ss   15:44   0:00 bash
root     12122  0.0  0.0   4376   784 ?        S    15:44   0:00 sleep 1

并且以下陷阱无法在容器关闭时关闭stardog
trap 'kill -TERM $PID' TERM INT
$SBIN/bin/stardog-admin server start && (tail -f /storage/stardog.log &) && while (pidof java > /dev/null); do sleep 1; done
PID=$!
wait $PID
trap - TERM INT
wait $PID
EXIT_STATUS=$?

所以我的问题是如何正确捕获$ SBIN/bin/stardog-admin服务器启动,以便在容器关闭时,stardog正常退出。

问候
康泰

最佳答案

您可以使用专用图像来处理此类问题,例如 phusion/baseimage-docker

请参阅“PID 1 zombie reaping issue”:通过declaring your script as a daemon,您将确保图像正确处理关闭信号。

关于bash - 如何为由&&分隔的多个命令创建PID陷阱,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33960873/

10-13 03:33