2012-08-23 161 views
10

我正在使用本地編譯的jsvc來啓動java守護進程。我在openSUSE 32位虛擬機上運行它。該代碼實現了Apache的守護進程接口,並使用以下命令執行deamon。Apache jsvc無法停止守護進程

./jsvc -home jre -errfile logs/jsvc.err -pidfile daemon.pid -cp <my_classpath> com.loader.loaderservice.LoaderDaemon 

它啓動並運行沒有問題。我可以以普通用戶身份和root身份啓動守護進程。但是,當我終止守護進程時,jsvc殺死進程而不是發出停止命令。

./jsvc -stop -home jre -outfile logs/jsvc.err -errfile logs/jsvc.err -pidfile daemon.pid -cp <my_classpath> com.loader.loaderservice.LoaderDaemon 

守護進程死亡,但不執行任何其關閉步驟(例如,它應該登錄,標誌着一個數據庫中的記錄,等等)。我得到的日誌/ jsvc.err文件中的以下內容,不寫任何其他日誌:

Service exit with return value 143 

谷歌搜索的錯誤後,我看到的極少數人誰都已經看到了同樣的事情,但是我找不到一個好的解決方案(http://mail-archives.apache.org/mod_mbox/commons-dev/200401.mbox/%[email protected]。 es%3E,http://www.tek-tips.com/viewthread.cfm?qid=1014679,http://threebit.net/mail-archive/tomcat-users/msg03832.html)。

更新: 使用Apache的窗口的服務啓動器(procrun)我能夠啓動和停止服務沒有任何問題。這個問題似乎只與jsvc相關,並且只能停止守護進程。

更新2: 更仔細地閱讀http://commons.apache.org/daemon/jsvc.html#Starting_jsvc後,我注意到,停止標籤我使用的問題kill命令PN通過我指定PID文件的過程。看起來jsvc實際上並沒有按照設計優雅地停止守護進程。這與我看到的行爲一致,因爲非常詳細的停止方法不會寫出任何消息。

-stop  stop the service using the file given in the -pidfile option 

新問題:

  • 如果我的Java主已經實現了Apache的守護程序接口,我怎麼發佈有關運行的守護一個「停」?
  • 我是否需要jsvc以外的東西(它似乎只對啓動或殺死守護進程有用)?

回答

5

啊,好的。事實證明,jsvc stop命令行爲正確。我必須深入瞭解進程通過kill命令在Linux/Unix中接收終止消息的方式。 Jsvc在守護進程上發佈了一個kill -15(這是一個軟件殺手)。請參閱:http://commons.apache.org/daemon/http://en.wikipedia.org/wiki/Kill_(command)以瞭解unix進程如何接收消息。

真正的問題是在構建守護進程。在我的啓動方法中,守護進程循環運行,直到發出關閉命令爲止,從而防止守護進程放棄作爲守護進程子進程的控制權。

我有這樣的:

@Override 
public void start() 
{ 
    doStartWork(); 
    while (isAlive()) 
    { 
     Thread.sleep(1000); 
    } 
} 

我應該低於過,所以我可以返回,並允許守護線程從OS接收信號。請參閱http://commons.apache.org/daemon/jsvc.html#How_jsvc_works,具體可參見以下部分:'受控過程:'

@Override 
public void start() 
{ 
    doStartWork(); 
}