繁体   English   中英

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

[英]Start/stop java application from an external script

我有一个独立的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

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

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

这看起来像一个Daemon

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM