Apache jsvc 无法停止守护进程

标签 apache daemon exit-code jsvc

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

./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 的 Windows 服务启动器 (procrun),我可以毫无问题地启动和停止服务。该问题似乎仅与 jsvc 相关,并且仅与停止守护进程有关。

更新2: 读完http://commons.apache.org/daemon/jsvc.html#Starting_jsvc后更仔细地,我注意到我使用的停止标签通过我指定的 pid 文件发出了一个终止进程的命令。看来 jsvc 实际上并没有按照设计优雅地停止守护进程。这与我所看到的行为一致,因为非常详细的停止方法不会写出任何消息。

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

新问题:

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

最佳答案

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

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

我有这个:

@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();
}

关于Apache jsvc 无法停止守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12097104/

相关文章:

java - 可移植开源 Java Web 服务器推荐?

security - 为什么 Apache 需要 SSLCertificateKeyFile?

android - 无法识别的 VM 选项 'MaxPermSize=512m' 错误 : Could not create the Java Virtual Machine. 错误 : A fatal exception has occurred. 程序将退出

bash - 从 gnome 终端中获取 bash 退出命令

java - 如何通过 Apache Olingo V4 Java API 使用字符串枚举

ruby-on-rails - 没有这样的文件或目录 - config/environment.rb phusion guest apache centos 6.3 Rails

java - C++ 或 Java 中的 Linux 守护进程?

python - 如何从另一个脚本将 Bottle 作为守护进程启动?

ios - 命令/usr/bin/codesign 失败,退出代码为 1

shell - 终端 - 为什么即使找不到匹配项,grep 的退出命令也是 0?