Linuxサーバーで各種サービスを起動する際に発生するエラーで「Address already in use」といったエラーメッセージが表示され対象サービスが起動しない現象が発生することがあります。
これは、起動しようとしているサービスで使用するポートを既に他のサービスやプロセスで使用してしまっている時に発生します。
今回、この現象についての対応方法についてまとめてみました。
Contents
「Address already in use」発生時の状況について
この現象が発生したLinuxサーバーでは、メールサーバーを稼働させており、受信メールサーバーでは、dovecotを使用していました。
サーバーのメンテナンスを行い、再起動して各種サービスの稼働状況を確認したところ受信メールサーバーのみ起動していないことがわかりました。
手動で起動させようとしたところ、下記のようなメッセージが表示されdovecotが起動できませんでした。
Error: service(pop3-login): listen(, 110) failed: Address already in use Error: service(pop3-login): listen(, 995) failed: Address already in use
Error: service(imap-login): listen(, 143) failed: Address already in use Error: service(imap-login): listen(, 993) failed: Address already in use
Fatal: Failed to start listeners
対象のポートを使用しているプロセスの確認
通常、このような現象が発生した場合には、対象となるポート(今回のケースでは、110、995、143、993となります。)を使用しているプロセスを下記のコマンドで確認します。
lsof -i :ポート番号(110など)
このコマンドで得られた情報からPIDのプロセスをkillコマンドで落として対応します。
kill プロセス番号(PIDを指定)
対象のポートが特定できなかった時の対応
しかし、今回、「lsof」コマンドでは何も結果が得られず、対象プロセスが存在していないことがわかりました。
直前のメンテナンスで行った履歴を確認すると「portreserve」なるサービスがインストールされている事がわかりました。
この「portreserve」は、意図していないプロセスを文字通りポートを占有しておいて起動させないためのサービスとなります。
「portreserve」の設定ファイルの設置ディレクトリを確認すると、「dovecot」とうファイルが配置されており、起動させないように予約されていました。
/etc/portreserve
「portreserve」の停止と「dovecot」の起動
起動している「portreserve」をを下記のコマンドで停止します。また、自動で起動しないように「chkconfig」コマンドも実行します。
# /etc/init.d/portreserve stop
# chkconfig portreserve off
次に「dovecot」を起動します。
# /etc/init.d/dovecot start
発生した環境について
今回、このような事象が発生した環境はAmazon Linux(amzn1)になります。取り急ぎこのような対応を行いましたが、最終的に「portreserve」の設定ファイル内を下記のようにコメントアウトして「portreserve」を起動させました。
#imap/tcp
#imaps/tcp
#pop3/tcp
#pop3s/tcp
#sieve/tcp
# /etc/init.d/portreserve start
# chkconfig --level 2345 portreserve on
今回のような現象は、これまでに経験が無く「lsof」コマンドで解決できていたので非常にあせりました。
直前のメンテナンスで「yum」によるサービスの更新を行っていたので、「yum.log」から見慣れない「portreserve」を発見し、AWSのフォーラムで同様の現象で悩んでいる方を発見して対応できました。
コメント