supervise/daemontools 与 apache -D FOREGROUND 冲突

supervise/daemontools 与 apache -D FOREGROUND 冲突

希望有人可以帮助我们理解这种行为。

/etc/service/ 下有一堆 daemontools 服务。其中一个服务控制 apache,运行脚本中包含该服务。

exec envdir /var/lib/supervise/wwwproxy/env setuidgid root bash <<-BASH
    ulimit -n 8192  # also increase the running user's file descriptor limit
    exec apache2 -f /path/to/demo_apache2.conf -D FOREGROUND
BASH 

我们遇到的问题svc -d /etc/service/*实际上是重新启动了所有服务,但并没有关闭它们。我们最终将问题追溯到那项服务,发现这svc -d /etc/service/apache2会带来向上任何其他服务都已关闭,包括其本身。

将 FOREGROUND 更改为 NO_DAEMONIZE 可以修复此行为,但我们确实想了解发生了什么。有人能解释一下svc -d为什么服务将带来其他服务正常吗?

感谢您提供的任何线索。

答案1

对我来说-D NO_DAEMONIZE不起作用,我不得不使用-D NO_DETACH。(CentOS 6.3,Apache/2.2.15)

也可以看看http://httpd.apache.org/docs/2.2/programs/httpd.html

还可以用于设置某些不太常见的启动参数,包括 -DNO_DETACH(防止父级分叉)和 -DFOREGROUND(防止父级调用 setsid() 等)。

答案2

我的建议是不要使用 daemontools 运行 Apache,但除此之外,您应该简化您的运行脚本。

从最基本的开始:

#!/bin/bash
exec apache2 -f /path/to/httpd.conf -D NO_DAEMONIZE

如果您需要/想要使用,envdir您可以使用它来启动 Apache,而不是exec
ulimit调用可能不是必需的,但可以在启动 Apache 之前将其添加到运行脚本中的任何位置。


回复:你看到的实际奇怪行为-DFOREGROUND和之间存在一些功能差异-DNO_DAEMONIZE——后者是我一直看到的推荐在 daemontools 下运行 Apache 的方法(前面加上强制性的“不要那样做”)——但我不知道为什么这些差异会导致您所描述的行为。

相关内容