質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Q&A

解決済

3回答

21679閲覧

httpdが正常終了しない

ssall

総合スコア30

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

2グッド

1クリップ

投稿2016/09/09 02:34

編集2016/09/09 05:24

※もしかしたら、調べ方が悪くあまりに初歩的な事柄でしたら申し訳ございません。

CentOS6.8上で下記コマンドを実行するとエラーが出てrestartできません。

[root@localhost ~]# service httpd restart httpd を停止中: [ OK ] 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 [失敗]

試しにservice httpd stop を実行してみると、上記のように停止中から[ok]と表示はされるものの、lsof -i | grep httpd で調べてみるとまだhttpdがポートを使用していて正常終了できていないと思われます。

調べてみても、kill -9 [ポート番号]という方法ばかりがでてきて、確かにこの方法でhttpdのポート使用が無くなるとrestartできるのですが、もう一度restartしようとすると上記のようになり、根本的な解決方法が中々見つかりません。

毎度killしなくても普通にrestartできるようにしたいのですが、やり方等ご教示頂けませんでしょうか。


追記:
ご依頼を受けましたので、httpdの起動スクリプトを記載致します。
長くなってしまいますがご了承ください。
コメントアウト箇所は省略しております。

. /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi HTTPD_LANG=${HTTPD_LANG-"C"} INITLOG_ARGS="" apachectl=/usr/sbin/apachectl httpd=${HTTPD-/usr/sbin/httpd} prog=httpd pidfile=${PIDFILE-/var/run/httpd/httpd.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd} RETVAL=0 STOP_TIMEOUT=${STOP_TIMEOUT-10} start() { echo -n $"Starting $prog: " LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } stop() { status -p ${pidfile} $httpd > /dev/null if [[ $? = 0 ]]; then echo -n $"Stopping $prog: " killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd else echo -n $"Stopping $prog: " success fi RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then RETVAL=6 echo $"not reloading due to configuration syntax error" failure $"not reloading $httpd due to configuration syntax error" else # Force LSB behaviour from killproc LSB=1 killproc -p ${pidfile} $httpd -HUP RETVAL=$? if [ $RETVAL -eq 7 ]; then failure $"httpd shutdown" fi fi echo } case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart|try-restart) if status -p ${pidfile} $httpd >&/dev/null; then stop start fi ;; force-reload|reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}" RETVAL=2 esac exit $RETVAL

追記2:
質問内でlsof -i | grep httpdの実行結果を載せていなかったので、念のため追記致します。

httpd 8755 root 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8755 root 6u IPv6 54937 0t0 TCP *:https (LISTEN) httpd 8758 apache 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8758 apache 6u IPv6 54937 0t0 TCP *:https (LISTEN) httpd 8759 apache 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8759 apache 6u IPv6 54937 0t0 TCP *:https (LISTEN) httpd 8760 apache 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8760 apache 6u IPv6 54937 0t0 TCP *:https (LISTEN) httpd 8761 apache 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8761 apache 6u IPv6 54937 0t0 TCP *:https (LISTEN) httpd 8762 apache 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8762 apache 6u IPv6 54937 0t0 TCP *:https (LISTEN) httpd 8763 apache 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8763 apache 6u IPv6 54937 0t0 TCP *:https (LISTEN) httpd 8764 apache 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8764 apache 6u IPv6 54937 0t0 TCP *:https (LISTEN) httpd 8765 apache 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8765 apache 6u IPv6 54937 0t0 TCP *:https (LISTEN) httpd 8766 apache 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8766 apache 6u IPv6 54937 0t0 TCP *:https (LISTEN) httpd 8767 apache 4u IPv6 54928 0t0 TCP *:http (LISTEN) httpd 8767 apache 6u IPv6 54937 0t0 TCP *:https (LISTEN)
KiyoshiMotoki, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/09/09 03:43

Apache の起動スクリプトの内容を質問欄に追記すると、より具体的な回答を得やすくなるかもしれません。起動スクリプトのパスは /etc/init.d/httpd や /etc/rc.d/init.d/httpd、あるいはその他 類似の場所にあるはずです。
ssall

2016/09/09 04:21

有難うございます。 これがその起動スクリプトなのか正直なところわかっておりませんが、追記致しますので何卒お願い致します。
ssall

2016/09/09 04:50

tcp 0 0 :::80 :::* LISTEN 8755/httpd
ssall

2016/09/09 04:51

issei.さん すいません。間違って内容だけ投稿してしまいましたが、上記のような結果になりました
issei.

2016/09/09 05:33

ありがとうございます。httpd以外も出てくるのではないかと心配しておりましたが、どうやらhttpdのみが多重起動しているか、上手く終了できていないようです。あとは回答者のみなさまに委ねます。
guest

回答3

0

ベストアンサー

少し切り分けていきましょう。

service httpd restart の実際の動作は service httpd stop service httpd start を連続実行しているものです。
restart に失敗するということは可能性として、

  • 停止に失敗している
  • 開始に失敗している

の2つがあり得ます。
まずこのどちらなのかを確認しましょう。

  • service httpd stop を実行し、その時点でhttpd がちゃんと止まっているのかを確認する
    ps ax| grep httpd の結果で確認するのがいいです。

ここまでのお話で、kill して start はできているとのことで、おそらく停止に問題があるのは想像がつくのですが、一応、確定させましょう。


上記の確認した後の予想です

停止がうまくできない理由の多くは、

  • 起動時に作られる pidfile と、停止時に参照する pidfile が一致していない
  • もしくは、起動時に pidfile の生成に失敗している

といったものになります。
質問に上がっているスクリプトを見ると、その範囲では同じ pidfile を使っているようにみえるのですが、 /etc/sysconfig/httpd の内容によって何かあるかもしれませんので、内容を追記していただけると、わかるかもしれません。

pidfileの生成に失敗している場合、指定されているパスが存在していない、もしくは書き込めないといった状態になっている可能性があります。
具体的な状況は確認しないとわかりませんが、

  • 起動時に pidfile が作成できている
  • その中身に書かれている pid と、ps ax|grep httpd で確認できる pid が一致している
  • 停止時に pidfile が削除されている

といったあたりがどうなっているか確認すると、どこで引っかかるかわかる気がします。

投稿2016/09/09 04:45

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssall

2016/09/09 04:53

ありがとうございます。 まず一つ目の実行結果についてですが、やはりお察し頂いた通り停止できていないように思える結果でした。以下が実行結果です 8323 ? S 0:03 gedit /etc/rc.d/init.d/httpd 8755 ? Ss 0:00 /usr/sbin/httpd 8758 ? S 0:00 /usr/sbin/httpd 8759 ? S 0:00 /usr/sbin/httpd 8760 ? S 0:00 /usr/sbin/httpd 8761 ? S 0:00 /usr/sbin/httpd 8762 ? S 0:00 /usr/sbin/httpd 8763 ? S 0:00 /usr/sbin/httpd 8764 ? S 0:00 /usr/sbin/httpd 8765 ? S 0:00 /usr/sbin/httpd 8766 ? S 0:00 /usr/sbin/httpd 8767 ? S 0:00 /usr/sbin/httpd 8807 pts/0 S+ 0:00 grep httpd
ssall

2016/09/09 04:54

すいません。上記は ps ax| grep httpdの実行結果です
ssall

2016/09/09 05:14

2つ目についてですが、stopを実行した後上記コマンドを実行した状態でも、http.pid(これが仰っているpidファイルだと思っているのですが・・)が/var/run配下に残っていました。中身を確認したところ8755とだけ記載されていました。 また、/etc/sysconfig/httpdについては全て#でコメントアウトされている状況でした。
kaz.Suenaga

2016/09/09 06:54

だとすると、質問にある起動スクリプトが /etc/init.d/httpd である前提で、 pidfile=${PIDFILE-/var/run/httpd/httpd.pid} となっていますので、 /var/run/httpd/httpd.pid が pidfile です。 コメントにある http.pid が上記ファイルのことだとしたら、8755 は起動時のhttpd のプロセスIDで停止後の ps ax の結果と一致しているので、見た感じは正しくできているように感じますね。 そうすると stop 時の動作を確認していきたいところです。 stop 時の動作の最初は `service httpd status` の動作ですので、 `service httpd status` の結果を教えていただけますか。
ssall

2016/09/09 07:10

以下が実行結果です。status自体は停止していると出てきます。 [root@localhost ~]# service httpd status httpd は停止しています [root@localhost ~]# netstat -lnp | grep :80 tcp 0 0 :::80 :::* LISTEN 2376/httpd
kaz.Suenaga

2016/09/09 07:36 編集

それはおかしいですね。 試しに status) status -p ${pidfile} $httpd を status) echo "${pidfile} $httpd" status -p ${pidfile} $httpd とした上で service httpd status を実行したとき、なんと出るか試せますか。
ssall

2016/09/09 07:44

httpdを上記のように変更して再度実行してみました。 [root@localhost ~]# service httpd status /var/run/httpd/httpd.pid /usr/sbin/httpd httpd は停止しています
ssall

2016/09/09 07:50

度々すみません。 追記ですが、/var/run/httpd/配下にはhttpd.pidは存在しないのですが、/var/run/配下にはhttpd.pidが存在していました。上記の結果と実際pidファイルがある場所が違うことは原因になりうるのでしょうか。
kaz.Suenaga

2016/09/09 07:51

そのままの状態で、 /var/run/httpd/httpd.pid は存在していますか。
kaz.Suenaga

2016/09/09 07:52

入れ違いました。 その場所が違うことは原因そのものになります。
kaz.Suenaga

2016/09/09 07:55

すると、起動時にpidfile を作っているパスと、停止時に見ようとしている箇所が異なることになるのですが、質問にある起動スクリプトには問題がないように見えます。 起動時は service httpd start で行っているんですよね? 例えば手動で apachectl start とかを行ったことはないでしょうか。
ssall

2016/09/09 08:02

すみません! pidファイルの場所がおかしいということでしたので、httpd.confのPidFile のパスを確認して下記のように修正したところrestartできるようになりました! run/httpd.pid ↓ run/httpd/httpd.pid
ssall

2016/09/09 08:05

回答が入れ違ってしまいました。 apachectl start等は行ったことはないのですが、新環境構築の際に旧環境のhttpd.confの設定を見よう見まねで行ったことがいけなかったかもしれません。 他の方も含め、長い時間お答えを頂きまして誠に有難うございました。 大変助かりました。
guest

0

こんな記事がありますね。
http://dqn.sakusakutto.jp/2012/05/svn-apache-%20listening-sockets-available.html

例えば以下のように grep してみてはどうでしょうか。

grep -ir "Listen 80" /etc/httpd/

投稿2016/09/09 02:47

bezeklik

総合スコア580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssall

2016/09/09 04:12

実行してみたところ /etc/httpd/conf/httpd.conf~:Listen 80 /etc/httpd/conf/httpd.conf:Listen 80 というように確かに2つでてきました
guest

0

httpd.confや、VirtualHostを設定している他の.confファイルなどで

Listen 80

が複数記載されているのではないでしょうか。
httpd.confにListen 80が書かれていたら、その時点でPort 80を使いますという宣言をしている事になるので、他の.confファイルで再度 Listen 80 を書いてしまうと「他のヒトが使うって言ってるよ?」と、警告が出されるわけです。

投稿2016/09/09 02:40

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssall

2016/09/09 04:08

有難うございます。 他の.confファイルに記述があった場合、どのようにしたら良いかまだ私にはわかりませんが、とりあえず.confファイル内に「Listen 80」の記述を探してみます。
kunai

2016/09/09 04:20

httpd.confに記載があるのは問題ありませんが、他の.confファイルに記載があった場合、それは削除してください。 心配でしたら #Listen 80 と、コメントアウトしていただいても構いません。 その状態で、一度Apacheを再起動(restart)するか、設定の再読み込み(reload)をしてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問