我有一个脚本,将做大量的准备工作(生成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 >& file是command >& 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说明可执行文件所在的目录。