解決策 1:
サービスの再起動部分のみ回答します。私も Monit に出会いましたが、CentOS 7 では systemd がすべてを処理してくれます。次の 2 行を .service ファイルに追加するだけです (まだ存在しない場合):
Restart=always
RestartSec=3
参照については、https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ を参照してください。
カスタムの systemd サービスを作成する場合、独自のサービス ファイルを作成するのは非常に簡単です。カスタム http サーバーについては、以下の例を参照してください。
新しいサービス ファイルでエディタを起動します:
vim /etc/systemd/system/httpd.service
そして、必要に応じて編集できる次のコンテンツを追加します。
[Unit]
Description=My httpd Service
After=network.target
[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
起動時に自動的に起動するようにしたい:
systemctl enable httpd
systemd に変更を伝え、サービスを開始します:
systemctl daemon-reload
systemctl start httpd
これで、ステータスを確認できます:
systemctl status httpd
参考までに、https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/ を参照してください。
解決策 2:
monit
は、サービスが失敗したときにサービスを監視および再起動するための優れた方法です。おそらく、これを他の重要なサービス (Apache など) に使用することになります。 monit
ではありますが、nixCraft に関する素晴らしい記事で、これをサービスに具体的に使用する方法を詳しく説明しています。 それ自体には、これ以外にも多くの機能があります。
ソケットの側面に関しては、@galraen がこのスポットに回答しました。
解決策 3:
setsockopt(2)
を呼び出すことができます SO_REUSEADDR
のリッスン ソケット用 、だからあなたは bind(2)
できるでしょう すべての接続が期限切れになるのを待たずにもう一度。別の可能性:カーネルからの接続を削除します。 FreeBSD には tcpdrop
があります Linux については知りません。
解決策 4:
Linux ディストリビューションが SysV init の代わりに Upstart を使用している場合、respawn
キーワードがこれを行います。
http://upstart.ubuntu.com/cookbook/#respawn