[英]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,它將啟用我想要運行的正常關閉操作,即我將處理在此程序停止之前我想要保留的任何內容。
現在我想做一個完整性檢查,以確保我正在考慮的方式是正確的方法。 或者有更好的方法來做到這一點。 任何建議表示贊賞。 並提前感謝。
如果您想要“優雅”關閉,在長時間運行的進程中打開套接字並讓“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.