如何为&&分隔的多个命令创build一个PID陷阱

我在Ubuntu 15.04容器中运行Stardog 4.0,打开jdk8,运行良好。 我想用一个陷阱优雅地closuresstardog 。

要在一个容器中执行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 

当容器closures时,下面的陷阱不能closuresstardog

 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 /斌/ stardogpipe理服务器启动,以便容器closures时,stardog正常退出。

感谢Conteh

您可以使用专门的图像来处理这种问题,如phusion/baseimage-docker

请参阅“ PID 1僵尸收割问题 ”:通过将脚本声明为守护进程 ,您将确保图像正确处理closures信号。

最后,我在容器中创build了一个runstardog.sh脚本。

 set -e function shutdown() { $STARDOG_BINARIES/bin/stardog-admin server stop -p xxx -u admin } $STARDOG_BINARIES/bin/stardog-admin server start && (tail -f /storage/stardog.log &) && while (pidof java > /dev/null); do sleep 1; done trap "{ shutdown }" EXIT exit 0 

这是由包含以下陷阱的startup.sh脚本执行的

 trap 'kill -TERM $PID' TERM INT $STARDOG_BINARIES/runstardog.sh & PID=$! wait $PID trap - TERM INT wait $PID EXIT_STATUS=$? 

然后当我想停止服务器时,我在服务器上调用stop.sh,这个服务器上的容器标识了stardog容器的CID,使用docker exec和stop来closuresstardog并删除容器。

 replace="\1" find="([a-z0-9]{12})\s+platform_stardog.*" CID=$( docker ps | tail --lines=+2 | sed "/platform_stardog/!d" | perl -lpe "s@$find@$replace@g" ) if [ -z "$CID" ]; then echo "No existing container named platform_stardog was found" else echo "docker exec /stardog_binaries/stopstardog.sh in platform_stardog Container $CID:" docker exec ${CID} /stardog_binaries/stopstardog.sh echo "stop and delete docker container." /usr/local/bin/docker-compose -p platform -f docker-compose.yml stop -t 30 stardog && /usr/local/bin/docker-compose -p platform -f docker-compose.yml rm --force -v stardog fi 

由于Stardog的输出'Stardog服务器成功接收到closures请求',并且closures过程不需要很长时间,所以我得到了确认。 它曾经通过docker工人指定的30秒钟停机-t 30

谢谢@VonC接下来我会尝试这个方法。