我正在使用本机编译的jsvc启动java守护进程。我是在openSUSE 32位虚拟机上运行这个的。代码实现了Apache的守护进程接口,我使用以下命令执行deamon。
./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守护进程会死,但它不会执行任何关闭步骤(例如,它应该记录,在db中标记一个记录,等等)。我在日志/jsvc.err文件中得到了以下内容,它不编写任何其他日志:
Service exit with return value 143在谷歌搜索错误后,我看到了少数人,他们都看到了相同的东西,但我找不到一个好的解决方案(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的服务启动程序(),我可以启动和停止服务,而不会出现任何问题。这个问题似乎只与jsvc相关,而且只与停止守护进程有关。
更新2:在更仔细地阅读了jsvc之后,我注意到我使用的停止标记通过我指定的pid文件发出了杀死命令pn。似乎jsvc实际上并没有通过设计来优雅地停止守护进程。这与我所看到的行为是一致的,因为非常冗长的停止方法并没有写出任何消息。
-stop stop the service using the file given in the -pidfile option新问题:
发布于 2012-08-29 20:40:15
啊,好吧。结果,jsvc停止命令的行为是正确的。我不得不深入研究进程如何通过杀死命令在Linux/Unix中接收终止消息。Jsvc在守护进程上发出一个杀死-15 (这是一个软杀死)。有关unix进程如何接收消息的说明,请参见:http://commons.apache.org/daemon/和(command。
真正的问题在于守护进程的构建。在我的start方法中,守护进程循环,直到发出一个关机命令,这阻止了守护进程作为守护进程子进程放弃控制。
我有这样的经历:
@Override
public void start()
{
doStartWork();
while (isAlive())
{
Thread.sleep(1000);
}
}下面应该有,这样我就可以返回并允许守护进程线程接收来自操作系统的信号。请参阅works,请参阅“受控进程:”一节。
@Override
public void start()
{
doStartWork();
}https://stackoverflow.com/questions/12097104
复制相似问题