重新启动Apache会挂起SSH会话

我有一个脚本,将做大量的准备工作(生成configuration文件,最小化和GZIP JavaScript和CSS文件等),然后重新启动安装在非标准位置的Apache。 但脚本运行后,当我试图exit我的SSH会话时,它只是无限期地挂起。

我已经阅读了build议 ,我应该redirectIO的实际调用到这样的httpd二进制文件:

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

这个工程和脚本完成后,我的SSH会话不再挂起。 但问题是,现在我已经失去了任何出错STANDR,如果出现错误,当它开始。 这对我来说似乎很奇怪,因为我有另一个系统有一个类似的(但不是确切的)设置,不会挂起。 从阅读推荐这个解决方法的build议,它说,守护进程(如Apache)应该已经在照顾这一点。 那么我错过了什么? 任何关于如何跟踪这个问题的指针或者我如何解决这个问题?

首先,你好像在错误的地方有&符号。 代替

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

我期望

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

编辑 – 实际上, command >& filecommand >& file的简短formscommand > file 2>&1 我从来没有使用这个简短的表格,所以我误解了这个结构的意图。

但我不会这样做。 将STDIN和STDOUtredirect到/ dev / null是错误的。 省略STDERR也是错误的。 这样做是为了把自己放入守护进程模式是错误的。 如果你真的必须这样做,我会做类似的事情

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

但是等等,Apache可以通过使用apachectl脚本发送信号来重启。 您可以向Apache发送信号以正常重新加载它的configuration,而不会丢弃现有的连接,或者可以发信号通知它重新启动。 如果你正在做的是改变它的configuration,只是做一个优雅的重新加载。 我也使用apachectl做一个configtest

如果Apache处于非标准位置,则应该仍然可以使用apachectl。

如果你不能使用apachectl,你可以发送SIGUSR1(重载)或SIGHUP(重启)信号给主httpd进程。

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

如果apachectl和启动脚本不能工作,因为你已经重新定位程序,我会编辑这些脚本,有variables说明可执行文件所在的目录。