web-dev-qa-db-ja.com

RHELでhttpdサービスを再起動すると「Stopping 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を起動できますか?

5
ghbarratt

/etc/init.d/httpdの停止関数はpidfileを使用します。

killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd

おそらく、pidfile /var/run/httpd.pidが古くなっている、または欠落している可能性があります(/etc/init.dスクリプトまたはservice?を使用せずに、過去にhttpdを起動したことがありますか?)そのファイル(およびその内容)はps -ef |grep httpで確認できます。

えっと、ただSudo kill 20181。次に、通常どおりにサービスを起動します。その後、再起動してみてください。

それが再び発生する場合は、おそらく、pidファイルがプロセステーブルを使用して無力になっている理由を調査する必要があります。

4
cjc

Ispconfig3とApacheを使用してcentos6で同様に実行しました。 cjcの投稿は、私の答えを見つけるのに役立ちました。 (ありがとう!)何らかの理由で、/ etc/httpd/conf/httpd.confのPIDパスが/etc/init.d/httpdのPIDパスと異なることがわかりました。それらを同じにした後(私はinit.dスクリプトをそのままにしてhttpd.confを編集することを選択しました)、ps -efに示されているPIDを使用してhttpdを強制終了し、/ etc/init.d/httpd startでhttpdを再度開始します。そうすべき。サービスhttpd status/stop/restart/startすべての動作が期待どおりになりました。

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

私のステータスでは、httpdがpsで実行されていることが明確に示されているにもかかわらず、停止が示されていました。 stopはエラーを出し、startは一部のポートですでに使用中のエラーを出しました。後から考えると、それは今では理にかなっていますが、誰かがそれに遭遇した場合にこれを投稿したかったのです。停止も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
1
Bill48105

HTTPプロセスを強制終了できるはずです。もちろん、現在の接続は中断され、誰かが現在データを送信している場合(たとえば、フォームを送信している場合)は失われる可能性があります。しかし、一般的には、そうです、これで問題ありません。同じことがservice httpd restartでも起こります。/var/lock/subsys/httpdにあるロックファイルをクリーンアップする必要があります(そのファイルを削除します)。

次に、service httpd configtestを実行して、Apache構成が少なくともロード可能であることを確認します。次に、service httpd startで開始してみてください

使用中のポートに関するエラーは、httpdがまだ実行されているためであり、それらのポートを使用しているためです。同様に、ログエラーも。

もう1つ-Sudoまたはpsを使用するためにnetstatを実行する必要はありません。 Sudoを必要とするものにのみ使用する習慣をつけてください。意図しないときにroot特権で破壊的なコマンドを実行しないようにすると、後でトラブルを回避できます。

1
malcolmpdx