Запуск Spring Boot как процесса переднего плана из сценария bash

я упаковываю свою весеннюю загрузочную войну со встроенным контейнером сервлетов Tomcat. И разверните его как обычное приложение java, используя java -jar server.war <Spring Args>. Я написал сценарий bash, который позаботится о развертывании сервера в качестве фонового / переднего плана:

start_foreground() {
    cmd="$JAVACMD ${JVM_OPTS} -jar ${WAR_FILE} ${SPRING_OPTS}"
    echo ""${cmd}""
    eval ${cmd}
    print_log "Server is stopped."
}

start_background() {
    SPRING_OPTS="--spring.pid.file=${PID_FILE} ${SPRING_OPTS}"
    cmd="nohup $JAVACMD ${JVM_OPTS} -jar ${WAR_FILE} ${SPRING_OPTS} &>${LOG_PATH}/console.log &"
    echo ""${cmd}""
    eval ${cmd}
    PID=$!
    print_log "Server is started with pid "${PID}""
}

как вы можете видеть, для запуска фонового процесса я использую nohup. Все работает нормально, он отправляет STDOUT и STDERR мой ${LOG_PATH}/console.log. console.log сообщает, что мой сервер запущен и работает на предварительно настроенном порту (используя Spring профили.) У меня есть профиль dev-https настройки с порта 8443:

spring:
  profiles.active: dev-https
...
---

spring:
    profiles: dev-https
server:
  port: 8443
  ssl:
    enabled: true
    protocol: TLS
    enabled-protocols: TLSv1.2
    key-store: <path>
    key-store-password: <password>

однако, когда я пытаюсь запустить сервер в качестве процесса переднего плана, я получаю неожиданное поведение. Всякий раз, когда я развертываю сервер с помощью start_foreground(), он запускается нормально, но порт сбрасывается по умолчанию 8080.

если я подключу отладчик и попытаюсь получить значения с помощью environment.getProperty("server.port"), он вернет пустую строку (однако, если свойство не определено, оно обычно возвращает null). Более того, все остальные свойства возвращают ожидаемые значения:

environment.getProperty("spring.profiles.active")=dev-https

environment.getProperty("server.ssl.enabled")=true

etc.

я попытался заменить eval С exec и даже запустить ${cmd} сам по себе внутри start_foreground() функция bash, но порт всегда сбрасывается на 8080 и server.port возвращает пустую строку.

самое странное, что если я выполнить ${cmd} в моей консоли (не из скрипта) все работает безупречно (правый профиль и правый порт get используемый.)

кто-нибудь сталкивался с такой странной проблемой?

2 ответов


похоже, вы используете конфигурацию(например, номер порта и т. д... только для фона и не используется для переднего плана. Вы не объявили переменную (вы пропустили эту строку)

`SPRING_OPTS="--spring.pid.file=${PID_FILE} ${SPRING_OPTS}"` 

на переднем плане.


Я попытался воспроизвести эту проблему с новым экземпляром Spring Boot. Написал небольшой bash-скрипт, и все прошло отлично!

затем я начал играть с моим оригинальным сценарием и узнал, что я использую SERVER_PORT переменной (потому что у меня был необязательный аргумент --port <num> для пользователей).

по-видимому, эта переменная среды также используется Spring Framework: https://www.concretepage.com/spring-boot/spring-boot-change-default-server-port#server_port

моей ошибкой был экспорт SERVER_PORT var (однако мне это было нужно по другим причинам).

решение было бы либо удалить export С export SERVER_PORT="" или переименовать переменную в что-то другое (что я в конечном итоге сделал).