【问题标题】:how to get process id of a spring boot application如何获取 Spring Boot 应用程序的进程 ID
【发布时间】:2016-11-29 10:56:49
【问题描述】:

我注意到 Spring Boot 在启动过程中在日志中打印了进程 ID。现在我想编写一个脚本来使用这个 pid 终止这个进程并再次启动应用程序。 Spring Boot 是否提供任何 api 来获取此 pid?谢谢!

【问题讨论】:

  • Windows 还是 Linux?
  • @AmrArafat Windows
  • 进程ID被写入文件。您可以阅读此文件以获取 pid。
  • 我刚刚检查了一个带有 web 和执行器启动器的小示例,并且没有像我的答案那样明确地将编写器添加为侦听器,因此没有创建文件(使用 Spring Boot 1.4.2)。
  • 嗯。我会发誓我在引导或默认注册该侦听器的执行器中看到了spring.factories。我可能需要一副新眼镜或睡个好觉:(。

标签: spring-boot pid


【解决方案1】:

System.getProperty("PID") 获取 SPRING BOOT PID。

Code

Result

【讨论】:

  • 请在答案中添加您的代码,而不是作为图片链接。
【解决方案2】:

Spring Boot 提供了 ApplicationPidFileWriter 类,然后它将 PID 写入文件。您可以通过将其作为侦听器添加到 SpringApplication 来激活它:

SpringApplication springApplication = new SpringApplication(DemoApplication.class);
springApplication.addListeners(new ApplicationPidFileWriter());
springApplication.run(args);

ApplicationPidFileWriter 的构造函数也可以采用 String 或带有自定义文件名的 File 对象。然后您可以从该文件中读取 PID 并在您的脚本中使用它。

【讨论】:

  • 这对我不起作用。日志也写入 pid 文件。你遇到过这样的情况吗?
  • 创建一个新问题并提供相关详细信息(代码 sn-ps 等)。
  • 要为答案添加更多细节,您可以通过在启动应用程序时提供 --spring.pidfile 参数来配置此文件的位置
【解决方案3】:

来自Part V. Spring Boot Actuator: Production-ready features documentation

在spring-boot模块中,可以找到两个类来创建文件 通常对过程监控很有用:

  • ApplicationPidFileWriter 创建一个包含应用程序 PID 的文件 (默认情况下,在应用程序目录中,文件名为 应用程序.pid)。
  • WebServerPortFileWriter 创建一个文件(或多个文件) 包含正在运行的 Web 服务器的端口(默认情况下,在 应用程序目录,文件名为 application.port)。

默认情况下,这些编写器未激活,但您可以启用:

  • 通过扩展配置
  • 第 60.2 节,“以编程方式”

这里是 60.1 扩展配置部分:

在 META-INF/spring.factories 文件中,您可以激活 写入 PID 文件的侦听器,如下例所示:

org.springframework.context.ApplicationListener=\
org.springframework.boot.context.ApplicationPidFileWriter,\
org.springframework.boot.web.context.WebServerPortFileWriter

在启动时启用 pid 和端口输出。

所以这个想法相当简单:在你的 Spring Boot 应用程序的 src/main/resources/META-INF 文件夹中,如果不存在,创建一个 spring.factories 文件,其中包含先前的内容以启用两者(pid 或端口)或使用以下内容来启用只有PID输出:

org.springframework.context.ApplicationListener=org.springframework.boot.context.ApplicationPidFileWriter

【讨论】:

    【解决方案4】:

    您可以执行 tasklist 命令列出活动进程,并显示它们的标识符 (PID)。

    您也可以将它们写入脚本中的文件:

    tasklist /v txt > filename.txt
    

    之后,您可以使用脚本读取文件并获取 pid。

    最终你会使用脚本来终止进程。

    【讨论】:

      【解决方案5】:

      无需使用ApplicationPidFileWriter,使用ApplicationPid即可:

      SpringApplication springApplication = new SpringApplication(MyApplication.class);
      springApplication.run(args);
      log.info(new ApplicationPid().toString());
      

      【讨论】:

        【解决方案6】:

        只需转到 /var/run/{your app name}/ ,读取 .pid 文件中的 pid。

        【讨论】:

          【解决方案7】:

          @dunni 已经提到,使用 ApplicationPidFileWriter 是一种方法。

          另一种方法是使用弹簧启动执行器。 actuator/env 将以 json 格式返回所有环境详细信息,例如 port#、PID# 和许多其他系统属性。

          http://hostName:port#/actuator/env

          要使用这个必须首先在他的应用程序中启用和公开执行器。 步骤:

          1. 在 pom 中添加执行器启动器依赖项
          2. 在属性文件中启用和公开所需的执行器端点。

          详情请参考:https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-metrics-endpoint

          【讨论】:

            猜你喜欢
            • 2022-08-05
            • 1970-01-01
            • 2010-11-08
            • 1970-01-01
            • 2015-12-28
            • 2016-09-26
            • 2019-07-05
            • 2011-06-13
            • 1970-01-01
            相关资源
            最近更新 更多