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
?