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

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

ただいまの
回答率

87.49%

httpdが正常終了しない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 16K+

score 29

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

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)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ssall

    2016/09/09 13:50

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

    キャンセル

  • ssall

    2016/09/09 13:51

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

    キャンセル

  • issei.

    2016/09/09 14:33

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

    キャンセル

回答 3

checkベストアンサー

+5

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

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 16:55

    すると、起動時にpidfile を作っているパスと、停止時に見ようとしている箇所が異なることになるのですが、質問にある起動スクリプトには問題がないように見えます。

    起動時は service httpd start で行っているんですよね?
    例えば手動で apachectl start とかを行ったことはないでしょうか。

    キャンセル

  • 2016/09/09 17:02

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

    run/httpd/httpd.pid

    キャンセル

  • 2016/09/09 17:05

    回答が入れ違ってしまいました。
    apachectl start等は行ったことはないのですが、新環境構築の際に旧環境のhttpd.confの設定を見よう見まねで行ったことがいけなかったかもしれません。

    他の方も含め、長い時間お答えを頂きまして誠に有難うございました。
    大変助かりました。

    キャンセル

+1

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

Listen 80

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/09 13:08

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

    キャンセル

  • 2016/09/09 13:20

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/09 13:12

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

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る