Windowsでは、サービスが失敗した場合に発生する動作を設定できます。 Linux(特にCentOS)で同じことを達成する標準的な方法はありますか?
私の質問の大きな部分は、開いたままになっているソケットをどのように処理するかです-たとえば、TIME_WAIT、FIN_WAIT1などの状態。
現時点で、開発中のサービスがクラッシュした場合、ソケットがクリアされるかリスンポートを変更してから手動で再起動する必要があります。
ご協力いただきありがとうございます。
monit
は、サービスが失敗したときにサービスを監視して再起動するための優れた方法です。おそらく、これを他の重要なサービス(Apacheなど)に使用することになります。 monit
自体には、これ以外にも多くの機能がありますが、 nixCraftに関する素敵な記事 を使用してサービスに具体的に説明する方法があります。
ソケットの側面については、@ galraenがこのスポットに答えました。
サービスの再起動部分にのみ答えます。 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/ を参照してください
_SO_REUSEADDR
_でリスニングソケットのsetsockopt(2)
を呼び出すことができるため、すべての接続が期限切れになるのを待たずに、再度bind(2)
を使用できます。別の可能性:カーネルからの接続を削除します。 FreeBSDにはこのためのtcpdrop
コマンドがありますが、Linuxについては知りません。
LinuxディストリビューションがSysV initではなくUpstartを使用している場合、respawn
キーワードがこれを行います。