Apache jsvc无法停止守护进程

Noa*_*oah 10 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
Run Code Online (Sandbox Code Playgroud)

它启动并运行没有问题.我可以作为普通用户和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
Run Code Online (Sandbox Code Playgroud)

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

Service exit with return value 143
Run Code Online (Sandbox Code Playgroud)

在谷歌搜索错误后,我看到一些人都看到了同样的事情,但我无处可寻找一个好的解决方案(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=1014679,HTTP://三比特. 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
Run Code Online (Sandbox Code Playgroud)

新问题:

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

Noa*_*oah 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); 
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该在下面,所以我可以返回并允许守护程序线程从操作系统接收信号.请参阅http://commons.apache.org/daemon/jsvc.html#How_jsvc_works,在下面的部分中可以看到:'受控过程:'

@Override
public void start() 
{
    doStartWork();
}
Run Code Online (Sandbox Code Playgroud)