Apache 正在运行;但是,它报告没有运行,并且不会重新启动

Apache 正在运行;但是,它报告没有运行,并且不会重新启动

Apache 正在运行;但是,它报告它没有运行,并且不会重新启动。

# /etc/init.d/httpd status
httpd.worker is stopped

# /usr/sbin/lsof -iTCP:80 
COMMAND    PID   USER   FD   TYPE DEVICE SIZE NODE NAME
httpd.wor 1169   root    3u  IPv6   2974       TCP *:http (LISTEN)
httpd.wor 1211 daemon    3u  IPv6   2974       TCP *:http (LISTEN)
httpd.wor 1213 daemon    3u  IPv6   2974       TCP *:http (LISTEN)
httpd.wor 1215 daemon    3u  IPv6   2974       TCP *:http (LISTEN)
httpd.wor 1352 daemon    3u  IPv6   2974       TCP *:http (LISTEN)

#/etc/init.d/httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd: [Wed Mar 24 10:33:51 2010] [warn] module proxy_ajp_module is already loaded, skipping
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
                                                           [FAILED]

操作系统:Linux 发行版:CENTOS 5
重新启动服务器没有帮助,终止 apache 并启动它也没有帮助。

知道是什么原因造成了这种不一致吗?

答案1

通常,init.d脚本使用文件来存储启动的守护进程的 PID,例如/var/run/httpd.pid或类似的东西。脚本可能存储了错误的 PID,或过时的 PID,或者存在权限问题,并且脚本无法首先创建文件。

答案2

我猜你有一个来自之前启动 Apache 的过时 PID 文件。我无法访问 CentOS 系统,但在我的 Fedora 11 机器上,此文件位于 /var/run/httpd/httpd.pid - 您可以通过在 /etc/init.d/httpd 中搜索“pidfile”来检查您的位置(我假设您使用的是从 RPM 安装的 Apache 版本;如果不是,并且您的 apache 位于 /usr/local/apache2 或类似位置,则 PID 文件位于 /usr/local/apache2/logs 中)。

停止 Apache,删除陈旧的 PID 文件,然后重新启动,就应该没问题了。

答案3

init.d 文件通常只是一个 shell 脚本——它可能会调用apachectl来启动和停止进程。检查它发送了什么命令来停止进程,并查看当您尝试直接运行它使用的任何命令(而不使用 init.d 文件)时会发生什么。

如果仍然不起作用,请检查您的网络服务器的错误日志,看看其中是否有任何有用的信息。

为了调试,您还可以尝试使用apachectl graceful命令发送 - 它将重新加载配置并重新启动子进程而不关闭主进程。(问题是,这意味着有一些配置更改不会生效,但除非您正在进行调整,否则它可能无关紧要)

答案4

我猜测你有两个不同的 init 脚本启动 apache,并且不同的 init 脚本使用不同的 pid 文件。

如果您这样做killall -9 httpd然后通过启动 Apache ,会发生什么情况/etc/init.d/httpd start

相关内容