java - 当我使用 nohup 时 Spring Boot 应用程序自动关闭

标签 java spring-boot systemd nohup

我已经实现了一个 Spring boot 应用程序。当我通过控制台或 IDE 运行该应用程序时,它可以顺利运行。但是,当我通过 nohup 命令将其注册为 systemd 服务时,它会在自动启动几秒钟后关闭,并在应用程序日志中显示以下行:

2019-06-18 17:36:18,176 INFO org.springframework.scheduling.concurrent.ExecutorConfigurationSupport [Thread-4] Shutting down ExecutorService 'applicationTaskExecutor'
2019-06-18 17:36:18,184 INFO org.springframework.scheduling.concurrent.ExecutorConfigurationSupport [Thread-4] Shutting down ExecutorService 'threadPoolTaskScheduler'
2019-06-18 17:36:18,186 INFO org.springframework.orm.jpa.AbstractEntityManagerFactoryBean [Thread-4] Closing JPA EntityManagerFactory for persistence unit 'default'
2019-06-18 17:36:18,194 INFO com.zaxxer.hikari.HikariDataSource [Thread-4] HikariPool-1 - Shutdown initiated...
2019-06-18 17:36:18,244 INFO com.zaxxer.hikari.HikariDataSource [Thread-4] HikariPool-1 - Shutdown completed.

systemd 文件(请忽略变量):

[Unit]
Description = Healthcheck notification Service
After network.target = {{healthcheck_notification_service_name}}.service
StartLimitBurst=5
StartLimitInterval=200
[Service]
Type=simple
User={{healthcheck_service_owner}}
Group={{healthcheck_service_owner}}
Restart=on-failure
RestartSec=30
SuccessExitStatus=143 
ExecStart = {{healthcheck_notification_installation_dir}}/{{healthcheck_notification_service_name}}/bin/service.sh start {{healthcheck_notification_service_name}}  {{healthcheck_notification_installation_dir}}/{{healthcheck_notification_service_name}}/lib/{{healthcheck_notification_installer_package_name}}.jar {{healthcheck_notification_installation_dir}}/{{healthcheck_notification_service_name}}/conf {{healthcheck_notification_installation_dir}}/{{healthcheck_notification_service_name}}/logs
ExecStop = {{healthcheck_notification_installation_dir}}/{{healthcheck_notification_service_name}}/bin/service.sh stop {{healthcheck_notification_service_name}}
ExecReload =  {{healthcheck_notification_installation_dir}}/{{healthcheck_notification_service_name}}/bin/service.sh restart {{healthcheck_notification_service_name}}  {{healthcheck_notification_installation_dir}}/{{healthcheck_notification_service_name}}/lib/{{healthcheck_notification_installer_package_name}}.jar {{healthcheck_notification_installation_dir}}/{{healthcheck_notification_service_name}}/conf {{healthcheck_notification_installation_dir}}/{{healthcheck_notification_service_name}}/logs

SyslogIdentifier={{healthcheck_notification_service_name}}
[Install]
WantedBy=multi-user.target

启动脚本:

#!/bin/sh

SERVICE_NAME=$2
PATH_TO_JAR=$3
PATH_TO_CONF=$4
PATH_TO_LOG=$5
APP_CONF_NAME=$6
PID_PATH_NAME=/tmp/$SERVICE_NAME-pid
case $1 in
start)
       echo "Starting $SERVICE_NAME ..."
  if [ ! -f $PID_PATH_NAME ]; then
       nohup java -Dloader.path=$PATH_TO_CONF -Dlogging.path=$PATH_TO_LOG -jar $PATH_TO_JAR --spring.config.location=$PATH_TO_CONF/$APP_CONF_NAME --logging.config=$PATH_TO_CONF/logback-spring.xml 2>> $PATH_TO_LOG/service.err >> $PATH_TO_LOG/service.out &
       echo $! > $PID_PATH_NAME
       echo "$SERVICE_NAME started ..."
  else
       echo "$SERVICE_NAME is already running ..."
  fi
;;
stop)
  if [ -f $PID_PATH_NAME ]; then
         PID=$(cat $PID_PATH_NAME);
         echo "$SERVICE_NAME stoping ..."
         kill $PID;
         echo "$SERVICE_NAME stopped ..."
         rm $PID_PATH_NAME
  else
         echo "$SERVICE_NAME is not running ..."
  fi
;;
restart)
  if [ -f $PID_PATH_NAME ]; then
      PID=$(cat $PID_PATH_NAME);
      echo "$SERVICE_NAME stopping ...";
      kill $PID;
      echo "$SERVICE_NAME stopped ...";
      rm $PID_PATH_NAME
      echo "$SERVICE_NAME starting ..."
      nohup java -Dloader.path=$PATH_TO_CONF -Dlogging.path=$PATH_TO_LOG -jar $PATH_TO_JAR --spring.config.location=$PATH_TO_CONF/$APP_CONF_NAME --logging.config=$PATH_TO_CONF/logback-spring.xml 2>> $PATH_TO_LOG/service.err >> $PATH_TO_LOG/service.out &
      echo $! > $PID_PATH_NAME
      echo "$SERVICE_NAME started ..."
  else
      echo "$SERVICE_NAME is not running ..."
     fi     ;;
 esac

最佳答案

Systemd 将 Type=simple 定义为

A long-running process that does not background its self and stays attached to the shell

在启动脚本中,您可以在命令末尾使用 nohup& 将命令发送到后台。您的类型可能应该是forking

Here也是一个很好的解释。

关于java - 当我使用 nohup 时 Spring Boot 应用程序自动关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56644941/

相关文章:

java - 富客户端 UI 的设计建议

java - Android Studio : Buttons not showing up during editing mode in RelativeLayout

java - 如何在java中使用正则表达式分割字符串

docker - 启动时启动 Docker-Engine

linux - centos 7 : nginx Failed to read PID from file/run/nginx. pid:参数无效

java - 需要 int 但有问题并发现零字节

spring-boot - spring-kafka KafkaListener 运行时自动启动行为

java - 我们如何通过Jpa获取完整的分层数据列表

java - 在 Spring Boot 应用程序中,负载均衡器请求有时会在 AWS 上意外失败

c# - 使用 .netcore 3.0 和使用/p :PublishSingleFile=true flag? 时如何获取可执行文件的实际路径