10

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

./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

守护进程终止,但不执行任何关闭步骤(例如,它应该记录、标记数据库中的记录等)。我在 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

新问题:

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

1 回答 1

5

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

真正的问题在于守护进程的构建。在我的启动方法中,守护程序循环直到发出关闭命令,这阻止了守护程序放弃作为守护程序子进程的控制权。

我有这个:

@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();
}
于 2012-08-29T20:40:15.160 回答