如何为由 && 分隔的多个命令创建 PID 陷阱
How do I create a PID trap for multiple commands separated by &&
我 运行 在 Ubuntu 15.04 容器中安装 Stardog 4.0,并打开 jdk8 运行 没问题。我想用陷阱处理 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
。
参见“": by declaring your script as a daemon,您将确保图像正确处理关机信号。
最后我在容器中创建了一个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 关闭 stardog 并停止和删除容器。
replace=""
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服务器成功收到关机请求'并且关机过程不会花费很长时间。它曾经挂起通过 docker compose stop -t 30
指定的 30 秒
谢谢@VonC,接下来我会试试这个方法。
我 运行 在 Ubuntu 15.04 容器中安装 Stardog 4.0,并打开 jdk8 运行 没问题。我想用陷阱处理 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
。
参见“
最后我在容器中创建了一个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 关闭 stardog 并停止和删除容器。
replace=""
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服务器成功收到关机请求'并且关机过程不会花费很长时间。它曾经挂起通过 docker compose stop -t 30
指定的 30 秒谢谢@VonC,接下来我会试试这个方法。