我有一个.rpm,我创build。 在它的%post部分,我做了一些东西,在这个脚本的最后,我打电话给service httpd restart 。 它给出了以下错误:
+ service httpd restart Stopping httpd: [FAILED] Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:81 (98)Address already in use: make_sock: could not bind to address 0.0.0.0:81 no listening sockets available, shutting down Unable to open logs [FAILED]
我从rpm详细安装(-vv)得到了这个。 所以我知道它关于httpd重新启动本身,没有别的。 根据netstat只有一个进程(httpd)正在监听端口81。
$ sudo netstat -nlp | grep 81 tcp 0 0 :::81 :::* LISTEN 29670/httpd
我不明白,为什么要停止运行http FAILS,并在启动失败。
任何想法如何解决这个问题?
这有时表明主机受到攻击或者运行不当。 我说,因为大量的恶意软件进入背景,并忽略信号妥协。 但是,它们通常不会closures在叉处出现的打开的文件描述符。
这导致了由apache保持打开的套接字被忽略信号完成的恶意软件inheritance的情况。 这导致“无法绑定到地址”的问题。
尝试发出命令pgrep -l -u apache ,看看有没有进程显示不是apache。
init.d脚本(由service命令调用)取决于实现,不如您认为的那样聪明。 我在许多这些实现中看到,“开始”的执行将原始httpd进程(即以root身份运行的进程号)的进程号码取消。 然后,当你执行“停止”过程时,它只是简单地消灭(使用合适的信号编号)根httpd进程。
有时候,奴隶进程会成为孤儿,不会被杀死(因为他们可能会被打破,对父母的信号没有做出适当的反应)。 如果是这种情况,那么端口仍然由从进程连接,执行“重启”或“启动”将失败。
你需要做的是做一个“ ps -aef | grep httpd | grep -v grep ”来查找被破坏的slave进程,并直接杀掉它们(使用kill -9 pid# )。 可能有不止一个破碎的过程。
一旦所有被破坏的进程都被删除了,那么你可以再次启动Apache服务器。