我使用本机编译的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=1014679,http://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
新问题:
答案 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();
}