【问题标题】:How to make daemon --stop blocking until underlying process will die?如何使守护进程 --stop 阻塞直到底层进程死亡?
【发布时间】: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 应用程序的行为,但是可以,尝试类似...我将其作为解决方案发布...

标签: bash signals daemon


【解决方案1】:

这可能会有所帮助:

while true; do
  daemon --name=my-service --running --verbose | grep not
  [ $? -eq 0 ] && exit
  sleep 1
done

描述为 p 码: 永远 { 检查daemon --name=my-service --running --verbose 是否返回包含单词not 的东西 如果是,exit 否则sleep a second }

【讨论】:

  • 谢谢。我会在几秒钟后将其调整为超时。
  • 不要使用grepdaemon --running 提供退出状态,因此您可以等效地编写:while daemon --name=my-server --running; do sleep 1; done
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2019-09-17
  • 1970-01-01
  • 2017-02-18
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多