service supervisor start
を実行すると、次のエラーが発生します。
Starting supervisor: Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
For help, use /usr/bin/supervisord -h
/ var/log/superuser/supervisord.logの内容:
2014-08-04 16:25:45,891 CRIT Supervisor running as root (no user in config file)
2014-08-04 16:25:45,891 WARN Included extra file "/etc/supervisor/conf.d/com.domain.subdomain.conf" during parsing
知っておくべきこと:
-Digital OceanサーバーでDebian Wheezyを使用しています。
-スーパーバイザーが使用するポートを同じ仕様のクリーンなVagrantボックスで確認しようとしましたが、同じエラーが発生しました。
どのポートがこのエラーの原因であるかを確認するにはどうすればよいですか?
.sock
ファイルのリンクを解除して問題を解決しました。
Sudo unlink /var/run/supervisor.sock
それでも解決しない場合は、/tmp/supervisor.sock
でファイルをチェックしてリンクを解除してください。
これを端末に入力してください
ps -ef | grep supervisord
これらのように監視対象のPIDを取得します
root 2503 1 0 Nov19 ? 00:03:23 /usr/bin/python /usr/bin/supervisord
root 21337 2556 0 18:15 pts/8 00:00:00 grep --color=auto supervisord
そして、PIDは2503です
次に、これを入力します。
kill -s SIGTERM 2503
うまくいくはず
私の状況は少し具体的でしたが、これはまだ役に立つかもしれません。
同じホストでいくつかのdocker containerを実行していました。すべてのコンテナは ホストネットワーキングモード で実行されていました。各コンテナには、スーパーバイザーによって監視される複数のプロセスがありました。
最初のコンテナは常に表示され、他のコンテナはすべて、OPが言及した警告で失敗します:Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
私にとっての問題は、スーパーバイザー構成に次の行があることでした。
[inet_http_server]
port=127.0.0.1:9001
[supervisorctl]
最初のコンテナはポート9001に正常にバインドされ、後続の各コンテナは既に取得された同じポートにバインドしようとするため、起動に失敗します。
これらの行を次の行に置き換え、localhost:9001上のHTTPサーバーバインディングからUNIXドメインソケットで実行されているサーバーに切り替えました。
[unix_http_server]
file=/var/run/supervisor.sock
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
これにより、ポートの衝突が修正され、すべてのコンテナを起動できました。
@ N'falyKabaの回答に似ていますが、おそらくもう少し直接的なものです。Supervisorの新しいバージョンでは、supervisorctl pid
pidを取得して強制終了し、再起動します。
$ kill -s SIGTERM $(supervisorctl pid)
再起動します:
$ supervisord -c /path/to/supervisord.conf
ソース: docs 。
ここでも同じ問題がありました。解決策はsystemctl stop supervisor.service
はサービスを停止しませんでした。 supervisordはまだ実行されている可能性があります他の方法で考えていますが。
ソケットを手動でリンク解除する前に、必ず試してみてください。
私はよく/etc/init.d/supervisor restart
けれども/etc/init.d/supervisor stop && /etc/init.d/supervisor start
動作します。