我有一个脚本,它可以完成很多准备工作(生成配置文件、最小化和 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 和启动脚本不起作用,我会编辑这些脚本,其中有变量可以说明可执行文件位于哪个目录中。