Как создать ловушку PID для нескольких команд, разделенных &&

Я запускаю Stardog 4.0 в контейнере Ubuntu 15.04 с открытым jdk8, который работает нормально. Я хочу справиться с грациозным отключением 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 грациозно завершал работу.

С уважением Конте

2 ответа

Решение

В конце я создал скрипт 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 на сервере, на котором размещен контейнер, который идентифицирует CID для контейнера stardog, выключает stardog с помощью docker exec и останавливает и удаляет контейнер.

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 успешно получил запрос на отключение' и что процесс выключения не занимает много времени. Раньше зависал в течение 30 секунд, указанных через докер compose stop -t 30

Спасибо @VonC, я попробую этот метод дальше.

Вы можете использовать выделенное изображение, созданное для решения таких проблем, как phusion/baseimage-docker,

Смотрите " PID 1 Zombie Reaping Issue ": объявив свой скрипт как демон, вы убедитесь, что изображение правильно обрабатывает сигнал выключения.

Другие вопросы по тегам