Apache jsvc无法停止守护进程

时间:2012-08-23 17:30:09

标签: apache daemon exit-code jsvc

我使用本机编译的jsvc来启动java守护进程。我在openSUSE 32位vm上运行它。代码实现了Apache的守护进程接口,我正在使用以下命令执行deamon。

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

它启动并运行没有问题。我可以作为普通用户和root用户启动守护进程。但是,当我去终止守护进程时,jsvc会终止进程而不是发出stop命令。

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

守护程序进程终止,但不执行任何关闭步骤(例如,它应该记录,标记数据库中的记录等)。我在logs / jsvc.err文件中得到以下内容,并且它不会写任何其他日志:

Service exit with return value 143

在谷歌搜索错误之后,我看到一小部分人都看到了同样的事情,但我无处可寻找一个好的解决方案(http://mail-archives.apache.org/mod_mbox/commons-dev /200401.mbox/%3CPine.GSO.3.96.1040105133739.23375A-100000@merlot.tel.uva.es%3E, http://www.tek-tips.com/viewthread.cfm?qid=1014679http://threebit.net/mail-archive/tomcat-users/msg03832.html)。

更新 使用Apache的窗口的服务启动器(procrun)我可以毫无问题地启动和停止服务。该问题似乎只与jsvc相关,并且仅在停止守护进程时才会出现。

更新2: 在仔细阅读http://commons.apache.org/daemon/jsvc.html#Starting_jsvc后,我注意到我正在使用的停止标记通过我指定的pid文件发出了一个kill命令。似乎jsvc实际上并没有通过设计优雅地停止守护进程。这与我所看到的行为一致,因为非常详细的stop方法不会写出任何消息。

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

新问题:

  • 如果我的java main已经实现了Apache Daemon接口,那么如何在正在运行的守护进程上发出'stop'?
  • 我是否需要jsvc以外的东西(看起来它只对启动或杀死守护进程有用)?

1 个答案:

答案 0 :(得分:5)

啊,好的。事实证明,jsvc stop命令行为正常。我不得不通过kill命令深入研究进程在Linux / Unix中接收终止消息的方式。 Jsvc在守护进程上发出了kill -15(这是一个软杀)。有关unix进程如何接收消息的说明,请参阅:http://commons.apache.org/daemon/http://en.wikipedia.org/wiki/Kill_(command)。

真正的问题在于构建守护进程。在我的start方法中,守护进程循环,直到发出了一个shutdown命令,这阻止了守护进程作为守护进程子进程放弃控制。

我有这个:

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

我应该在下面,所以我可以返回并允许守护程序线程从操作系统接收信号。请参阅http://commons.apache.org/daemon/jsvc.html#How_jsvc_works,或者在“受控流程:”

下的部分
@Override
public void start() 
{
    doStartWork();
}