【发布时间】:2023-03-07 16:02:01
【问题描述】:
我有一个使用 daemon 命令 (RHEL 6.2) 守护进程的 java 进程。我正在使用以下行来启动该过程,并使用下面的行来停止它:
daemon --command "/opt/my-service" --respawn --name=my-service --verbose
daemon --stop --name=my-service --verbose
在我尝试使用停止/启动方法重新启动我的进程之前,一切正常:
daemon --stop --name=my-service --verbose
daemon --command "/opt/my-service" --respawn --name=my-service --verbose
如果在执行上述命令之前进程正在运行,则现有进程将停止但不会创建新进程。相反,以下行将被记录到/var/log/messages:
Oct 27 07:59:46 myhostname my-service: my-service: fatal: failed to become a daemon: Resource temporarily unavailable
据我了解,这意味着我们试图获取 pid 文件的锁定,但另一个进程正在持有该锁定。或者换句话说:原始进程仍在运行。
有趣的是它无法通过以下命令复制:
daemon --command "sleep 30s" --respawn --name=sleeper --verbose
daemon --stop --name=sleeper --verbose
daemon --command "sleep 30s" --respawn --name=sleeper --verbose
那么我的进程中一定有什么东西导致/利用了--stop的异步性质。
如何让--stop 阻塞?
【问题讨论】:
-
你试过了吗:
daemon --name=my-service --running? -
我没试过。你的意思是我可以写一个循环,直到进程终止(有一些超时),然后重新启动进程?
-
好吧,我无法重现您的 Java 应用程序的行为,但是可以,尝试类似...我将其作为解决方案发布...