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)
新问题:
喔好吧.事实证明,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)
| 归档时间: |
|
| 查看次数: |
7507 次 |
| 最近记录: |