【问题标题】:Apache jsvc fails to stop daemonApache jsvc 无法停止守护进程
【发布时间】:2012-08-19 07:00:38
【问题描述】:

我正在使用本机编译的 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 命令 pn 进程。似乎 jsvc 实际上并没有通过设计优雅地停止守护进程。这与我看到的行为一致,因为非常冗长的 stop 方法没有写出任何消息。

-stop        stop the service using the file given in the -pidfile option

新问题:

  • 如果我的 java main 实现了 Apache Daemon 接口,我如何在正在运行的守护进程上发出“停止”?
  • 除了 jsvc 之外,我还需要其他东西吗(似乎它只对启动或终止守护进程有用)?

【问题讨论】:

    标签: apache daemon exit-code jsvc


    【解决方案1】:

    啊,好的。事实证明 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多