2016-04-06 101 views
1

我開發了一個shell腳本,它調用一個java程序的主要方法RHEL環境。Shell腳本調用運行java程序的非主要方法

shell腳本(比如app.sh)對的tomcat.sh

start:線多個選項將通過調用main方法啓動java程序

stop:它會得到運行的進程ID和終止進程

我已經執行了startstop命令,並期待實現暫停命令。

pause:這個選項應該得到運行Java應用程序的PID和調用非主要方法

我沒有問題來獲取進程ID。 但我可以從運行進程ID調用Java程序的非主要方法嗎?

編輯:

How can I call a method in an object from outside the JVM?問題提供解決方案,在不同的技術,但我不能移動到不同的技術,但使用的shell腳本。

+1

我認爲你不能那樣做。檢查[這](http://stackoverflow.com/questions/9411972/calling-java-methods-from-shell-scripts)的更多信息。 – dambros

+2

http://stackoverflow.com/questions/368802/how-can-i-call-a-method-in-an-object-from-outside-the-jvm – user3159253

+0

我檢查了這個問題。但我期待調用現有流程的非主要方法,而不是調用新流程的新主要方法 –

回答

2

解決辦法是這樣的:

  1. 創建服務作爲一般。
  2. 該服務通過JMX或簡單地通過監聽一個有限的已知命令集的TCP/unix域套接字來公開一些方法。
  3. 當需要控制時,服務需要一個專用進程(大概是用Java編寫的與服務分開的實用程序)通過指定的命令通道發出所需的命令。

SO question that I mentioned in the comments包含所有必要的技術細節。其實所有的學分都應該在那裏給出,我只是重新排列他們的話。

或者在類Unix系統(包括Linux)中,您可以爲給定的pid(kill -STOP <pid>)發送SIGSTOP信號,並且在收到SIGCONT(kill -CONT <pid>)之前無條件停止JVM。但我想這應該是一個非常殘酷的解決方案。可能你會失去所有打開的連接等

1

我找到了一個解決方案來擺脫她的腳本只能調用程序的主要方法的限制。

  1. 程序A的RMI URL保存在數據庫或文件系統中。
  2. 程序B讀取該RMI URL。
  3. 腳本的啓動選項調用程序A的主要方法。腳本的暫停選項調用程序B的主要方法。
  4. 程序B調用程序A的遠程方法。

還有一個解決方案:調用一個jsp頁面,該頁面通過在暫停選項中使用wget命令從腳本調用遠程方法。