重新启动 Apache 会挂起 SSH 会话

重新启动 Apache 会挂起 SSH 会话

我有一个脚本,它可以完成很多准备工作(生成配置文件、最小化和 gzip Javascript 和 CSS 文件等),然后重新启动安装在非标准位置的 apache)。但是运行脚本后,当我尝试exit退出 ssh 会话时,它会无限期挂起。

我读过推荐我应该将实际调用的 IO 重定向到 httpd 二进制文件,如下所示:

sudo /path/to/httpd -f /path/to/config < /dev/null >& /dev/null

并且这有效,脚本完成后我的 ssh 会话不再挂起。但问题是,如果启动时出现问题,现在我丢失了输出到 STDERR 的所有错误。这对我来说真的很奇怪,因为我有另一个具有类似(但不完全相同)设置的系统,它不会挂起。从阅读建议此解决方法的建议中,它说守护进程(如 apache)应该已经在处理这个问题了。那么我遗漏了什么?有什么关于如何追踪或修复它的指示吗?

答案1

首先,你似乎把 & 符号放错了位置。而不是

/path/to/httpd -f /path/to/config < /dev/null >& /dev/null

我希望

/path/to/httpd -f /path/to/config < /dev/null > /dev/null &

编辑 - 实际上,command >& file是 的缩写形式command > file 2>&1。我从未使用过缩写形式,因此我误解了该构造的意图。

但我不会这么做。将 STDIN 和 STDOUt 重定向到 /dev/null 是错误的。省略 STDERR 也是错误的。对将自身置于守护进程模式的程序执行此操作是错误的。如果你真的必须这样做,我会这样做

nohup /path/to/httpd -f /path/to/config >/tmp/httpd.out 2>/tmp/httpd.err &

但是,请稍等,可以使用apachectl脚本向 Apache 发送信号来重新启动它。您可以向 Apache 发送信号,让它在不断开现有连接的情况下正常重新加载其配置,也可以向它发送信号,让它重新启动。如果您所做的只是更改其配置,只需正常重新加载即可。我还会使用apachectl它来执行configtest

如果 Apache 位于非标准位置,您仍然可以使用 apachectl。

如果您不能使用 apachectl,您可以向主 httpd 进程发送 SIGUSR1(重新加载)或 SIGHUP(重新启动)信号。

如果 apache 没有运行,启动它的最佳方式是使用/etc/init.d/apache start脚本

如果由于您重新定位程序而导致 apachectl 和启动脚本不起作用,我会编辑这些脚本,其中有变量可以说明可执行文件位于哪个目录中。

相关内容