在 RHEL 中重新启动 httpd 服务会返回“停止 httpd:[FAILED]” - 我该如何解决这个问题?

在 RHEL 中重新启动 httpd 服务会返回“停止 httpd:[FAILED]” - 我该如何解决这个问题?

这是我第一次发现问题:

$ 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

相关内容