我正在使用本机编译的 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 以外的东西(这似乎只对启动或终止守护进程有用)?