По некоторым причинам, не имеющим отношения к этому вопросу, я запускаю Java-сервер в сценарии bash не напрямую, а через подстановку команд под отдельной суб-оболочкой и в фоновом режиме. Цель заключается в том, что подкоманда возвращает идентификатор процесса сервера Java в качестве стандартного вывода. Fragement в вопросе заключается в следующем:Bash Command Substitution Предоставление Weird Несоответствующий результат
launch_daemon()
{
/bin/bash <<EOF
$JAVA_HOME/bin/java $JAVA_OPTS -jar $JAR_FILE daemon $PWD/config/cl.yml <&- &
pid=\$!
echo \${pid} > $PID_FILE
echo \${pid}
EOF
}
daemon_pid=$(launch_daemon)
echo ${daemon_pid} > check.out
В Java демон в вопросительных гравюр к стандартной ошибке и завершает работу, если есть проблема в инициализации, в противном случае она закрывает стандартный, и стандартный ERR и продолжает свой путь. Позже в скрипте (не показан) я делаю чек, чтобы убедиться, что процесс сервера запущен. Теперь о проблеме.
Всякий раз, когда я проверяю $ PID_FILE выше, он содержит правильный идентификатор процесса в одной строке.
Но когда я проверяю файл check.out, иногда содержит правильный идентификатор, в других случаях он содержит идентификатор процесса повторяется дважды на одной и той же линии, разделенных пробелом charcater как в:
34056 34056
I я использую переменную $ daemon_pid в сценарии выше в сценарии, чтобы проверить, работает ли сервер, поэтому, если он содержит pid, который повторяется дважды, это полностью исключает тест, и он неправильно считает, что сервер не запущен. Скрипт с скриптом на моем сервере, на котором запущена CentOS Linux, добавив больше эхо-заявлений и т. Д., Похоже, перевернул поведение обратно к правильному одному из $ daemon_pid, содержащему идентификатор процесса только один раз, но если я думаю, что он исправил его и проверил этот сценарий для моего исходного кода репо, а также выполнить сборку и развертывание, я начинаю видеть такое же плохое поведение.
Сейчас я установил это, предполагая, что $ daemon_pid может быть плохим и пропуская его через AWK следующим образом:
mypid=$(echo ${daemon_pid} | awk '{ gsub(" +.*",""); print $0 }')
Тогда $ mypid всегда содержит правильный идентификатор процесса, и все это хорошо, но само собой скажем, я хотел бы понять, почему он ведет себя так, как он. И прежде чем вы спросите, я посмотрел и посмотрел, но сервер Java, о котором идет речь, НЕ распечатывает свой идентификатор процесса до его стандартного номера перед закрытием стандартного.
Действительно оценен экспертный ввод.
Как вы защищаете от одновременных прогонов? Возможно, вы тоже используете скрипт? –
Хороший вопрос, на самом деле он не защищен от этого. Сборка и развертывание осуществляется через нашу собственную коробку Jenkins, и сервер является нашим, поэтому мы контролируем, поэтому я уверен, что этого не происходит. Плюс я видел такое же поведение, хотя не всегда и не последовательно, при запуске скрипта start.sh, который содержит вышеупомянутый фрагмент, непосредственно из командной строки в развернутом ящике. – user2456600
Кроме того, мы не запускаем выскочку в качестве стандартного демона. У нас есть незанятый процесс, основанный на использовании playbook для развертывания и запуска, который запускает только скрипт start.sh. На предыдущем шаге в незанятой пьесе она убивает любого существующего работающего демона. – user2456600