从外部脚本启动/停止Java应用程序

时间:2013-08-11 13:45:45

标签: java startup shutdown

我有一个独立的Java应用程序。目前我使用启动脚本运行这个Java应用程序,例如Windows中的startApplicatoin.bat和Linux中的startApplicatoin.sh,它设置类路径然后执行:java -classpath。

现在我必须添加一个stopApplication.bat和stopApplication.sh脚本。此停止脚本必须正常关闭/关闭此Java应用程序。

为实现这一目标,我计划采取以下步骤:

1。当我的java应用程序运行时,它会将启动的应用程序的进程ID存储在一个文件中,即在已知文件myapplication.pid中。

看起来ManagementFactory.getRuntimeMXBean()。getName()调用将在Linux和Windows上运行以获取进程ID。因此,我将以这种方式收集进程ID,并将其存储在指定的文件myapplication.pid中。

2. 然后,当运行停止应用程序脚本时,此脚本将向myapplication.pid文件指定的process-id发出“kill”请求。

对于Windows,我将运行" taskkill"命令停止此应用程序。对于Linux环境" kill"命令将用于此目的。

在我的java代码中,我将添加一个addShutdownHook,它将启用我想要运行的正常关闭操作,即我将处理在此程序停止之前我想要保留的任何内容。

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29

现在我想做一个完整性检查,以确保我正在思考的方式是正确的方法。或者有更好的方法来做到这一点。任何建议表示赞赏。并提前感谢。

2 个答案:

答案 0 :(得分:1)

如果您想要“优雅”关闭,在长时间运行的进程中打开套接字并让“stop”脚本连接到它并发出关闭可能更实际(更容易跨平台)命令;这可能通过JMX实现,具体取决于您的应用程序整体结构。 “内联”而不是需要与操作系统交互的方法通常更容易推理和测试。

答案 1 :(得分:1)

这看起来像Daemon

运行具有启动/停止功能的守护程序而不诉诸 lot 脚本的最简单方法是使用jsvc。这允许您的代码使用四种方法实现接口:

  • void init(String[] arguments):此处打开配置文件,创建跟踪文件,创建ServerSocket s,Thread s
  • void start():启动Thread,接受传入连接
  • void stop():通知Thread终止run(),关闭ServerSocket
  • void destroy():销毁在init()
  • 中创建的任何对象

然后,您可以使用特定于平台的二进制文件来处理跟踪过程并在请求时停止它。

最有用的是,jsvc可以作为超级用户(root on unix)启动进程,然后将该进程放到peon用户进行拍卖运行。

这就是Tomcat(例如)的工作方式,它以root身份启动并执行特权操作,例如绑定到端口80.然后出于安全原因,它将下拉到名为tomcat的peon使用。