web-dev-qa-db-ja.com

Linuxで障害が発生したときにサービスを自動的に再起動する方法

Windowsでは、サービスが失敗した場合に発生する動作を設定できます。 Linux(特にCentOS)で同じことを達成する標準的な方法はありますか?

私の質問の大きな部分は、開いたままになっているソケットをどのように処理するかです-たとえば、TIME_WAIT、FIN_WAIT1などの状態。

現時点で、開発中のサービスがクラッシュした場合、ソケットがクリアされるかリスンポートを変更してから手動で再起動する必要があります。

ご協力いただきありがとうございます。

26
Pryo

monitは、サービスが失敗したときにサービスを監視して再起動するための優れた方法です。おそらく、これを他の重要なサービス(Apacheなど)に使用することになります。 monit自体には、これ以外にも多くの機能がありますが、 nixCraftに関する素敵な記事 を使用してサービスに具体的に説明する方法があります。

ソケットの側面については、@ galraenがこのスポットに答えました。

26
Andrew M.

サービスの再起動部分にのみ答えます。 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/ を参照してください

24
Nagev

_SO_REUSEADDR_でリスニングソケットのsetsockopt(2)を呼び出すことができるため、すべての接続が期限切れになるのを待たずに、再度bind(2)を使用できます。別の可能性:カーネルからの接続を削除します。 FreeBSDにはこのためのtcpdropコマンドがありますが、Linuxについては知りません。

13
gelraen

LinuxディストリビューションがSysV initではなくUpstartを使用している場合、respawnキーワードがこれを行います。

http://upstart.ubuntu.com/cookbook/#respawn

4
JeffG