![在 RHEL 中重新启动 httpd 服务会返回“停止 httpd:[FAILED]” - 我该如何解决这个问题?](https://linux22.com/image/573760/%E5%9C%A8%20RHEL%20%E4%B8%AD%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%20httpd%20%E6%9C%8D%E5%8A%A1%E4%BC%9A%E8%BF%94%E5%9B%9E%E2%80%9C%E5%81%9C%E6%AD%A2%20httpd%EF%BC%9A%5BFAILED%5D%E2%80%9D%20-%20%E6%88%91%E8%AF%A5%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98%EF%BC%9F.png)
这是我第一次发现问题:
$ sudo /sbin/service httpd restart
Stopping httpd: [FAILED]
Starting httpd: no listening sockets available, shutting down
Unable to open logs
[FAILED]
我知道 httpd 正在运行
$ ps -ef | grep httpd | grep -v grep
apache 9619 20181 0 07:08 ? 00:00:03 /usr/sbin/httpd
apache 10092 20181 0 Jan24 ? 00:00:07 /usr/sbin/httpd
apache 13086 20181 0 06:09 ? 00:00:00 /usr/sbin/httpd
apache 13717 20181 0 Jan25 ? 00:00:01 /usr/sbin/httpd
apache 14730 20181 0 07:13 ? 00:00:01 /usr/sbin/httpd
apache 16359 20181 0 09:54 ? 00:00:00 /usr/sbin/httpd
root 20181 1 0 2011 ? 00:00:01 /usr/sbin/httpd
apache 21450 20181 0 09:55 ? 00:00:00 /usr/sbin/httpd
它使用端口 80 和 443
$ sudo netstat -lnp | grep :80
tcp 0 0 :::80 :::* LISTEN 9619/httpd
$ sudo netstat -lnp | grep :443
tcp 0 0 :::443 :::* LISTEN 9619/httpd
因此我假设我收到消息“没有可用的监听套接字”,因为 httpd 无法停止释放端口 80 和 443。
我正在使用 RHEL 版本 5.7:
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.7 (Tikanga)
我可以看到一堆 httpd 进程正在运行:
$ pgrep httpd
9619
10092
13086
13717
14730
16359
20181
21450
什么可以防止 httpd 停止?如果我终止 httpd 的进程,我是否能够毫无问题地启动 httpd?
答案1
/etc/init.d/httpd 中的停止功能使用 pidfile:
killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd
可能是 pidfile/var/run/httpd.pid
已过期或丢失(您以前是否启动过 httpd,而没有使用/etc/init.d
脚本或service
?)。您可以使用 来检查该文件(及其内容)ps -ef |grep http
。
嗯,就这样sudo kill 20181
。然后像平常一样启动服务。然后尝试重新启动。
如果再次发生,您可能应该调查为什么 pid 文件与进程表不一致。
答案2
您应该能够终止 HTTP 进程 - 当然,当前的连接将被中断,并且如果有人当前正在向您发送数据(例如,提交表单),则可能会丢失。但一般来说,是的,这没问题。同样的事情也会发生在 上service httpd restart
。您可能必须清理 /var/lock/subsys/httpd 处的锁定文件(删除该文件)。
然后我会运行service httpd configtest
以确保你的 apache 配置至少可加载。然后尝试使用service httpd start
您说得对,端口正在使用的错误是由于 httpd 仍在运行,因此正在使用这些端口。同样,日志错误也是如此。
sudo
还有一件事 -使用ps
或 时无需运行netstat
。养成只在需要时使用 的习惯sudo
。这将为您省去以后的麻烦,因为这样您可以避免在不经意的情况下以 root 权限运行某些破坏性命令。
答案3
在 centos6 上使用 ispconfig3 和 Apache 时遇到了类似的问题。cjc 的帖子帮我找到了答案。(谢谢!)结果发现,出于某种原因,/etc/httpd/conf/httpd.conf 中的 PID 路径与 /etc/init.d/httpd 中的不同。一旦我将它们设置为相同(我选择编辑 httpd.conf,保留 init.d 脚本不变),然后使用 ps -ef 中显示的 PID 终止 httpd,然后使用 /etc/init.d/httpd start 再次启动 httpd,瞧,它就可以正常工作了。服务 httpd 状态/停止/重新启动/启动现在也都按预期工作。
我怀疑 http.conf 文件可能是从 centos5 的备份中替换的,或者可能是在某个时候被编辑过,除非默认设置是错误的,尽管这似乎不太可能。
/etc/httpd/conf/httpd.conf
Before:
PidFile run/httpd.pid
After:
PidFile run/httpd/httpd.pid
/etc/init.d/httpd 给出了它应该是什么的提示:
# pidfile: /var/run/httpd/httpd.pid
我的状态显示已停止,尽管 ps 中清楚地显示 httpd 正在运行。stop 给出错误,start 给出一些已在使用的端口错误。事后看来,现在这很有意义,但如果其他人遇到同样的情况,我想发布此信息。stop 也会导致 httpd 死机,但有时子系统会被锁定。
我收到的错误示例:
Stopping httpd: [FAILED]
Starting httpd: (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