2012-08-23 116 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(); 
}