Linuxで停止した場合にサービスを監視して再起動する方法


24

実際、シェルスクリプトを使用すべきかどうか、または既にいくつかの方法があるかどうかはわかりません。しかし、どのアプローチを使用するにしても、サービスを常に実行し続けたいと思います。

iptables例として言ってみましょう。その後..

  • たびiptablesのサービスがあるstoppedか(他の言葉で)実行していない、私はそれになりたいstarted(またはrestarted自動的に...)それが停止したときに(または実行されていません)。
  • 他のもっと簡単な言葉で言えば、私はサービスを常に稼働させたいと思っています。

リアルタイムチェックを行うことが問題である場合は、チェックする頻度をかなり高くすることができます。5分ごとに)

私が考えることができる唯一の方法は、Cron Tabでシェルスクリプトを使用することです。

  • スマートな解決策はありますか?

ありがとう!


あなたはそれをするべきではありません。サービスが不適切に構成されていると仮定すると、あなたの戦略は何を達成しますか?再試行の無限リスト。代わりに、alerts動作していないものに対してcrontabスクリプトを作成する必要があります。
MariusMatutiae

私は、元の質問に対する単純な解決策に興味があります。また、restarted何らかの理由で、停止するたびに必要なサービスがあります。再起動しても問題ありません。
夏期劇場

1
独自の提案されたソリューションは十分にスマートです。正しく使用すると(サービスが既に実行されている場合はすぐに終了し、修正できるようにサービスが停止したことを警告するなど)、最も簡単な方法です。自動的に停止するサービスは問題のあるサービスなので、最終的には修正する必要がありますが、そうでなければ、一時的なパッチ、cronスクリプト、またはほとんどの時間スリープする別の非常にシンプルなデーモンとして、問題なく動作します。そこのようないくつかのツールですmmonit.com/monitは、私は最終的に、彼らはすべて同様のアプローチを使用することを考える

@MariusMatutiae、私はあなたの意見に同意しますが、それはサービスの性質に依存し、ほとんどのプロセスマネージャーは何度も再起動に失敗した後に後退します。プロセスが自然に終了することは完全に合理的であり、たとえば、キュ​​ーからジョブを取得して各実行後に終了するワーカーなど、プロセスを自動的に再起動することは合理的です。...プロセスの寿命の限界とそれが手に負えなくなる前に、それを自動的に再起動する-それはまた、オーダーメイドのメモリリークするコードに苦しむシステム管理者のための便利なツールです
アレックスフォーブス

回答:


25

2018年3月に更新

この回答は現在かなり古く、書かれて以来、systemdはLinuxでのpid1戦争に勝ちました。したがって、systemdがディストリビューションに組み込まれている場合(ほとんどの場合)、おそらくsystemdユニットを作成する必要があります。

以下の回答は、後世のために保存されています。


上記のmonitの答えは有効ですが、いくつかの代替案に言及すると思いました。

オペレーティングシステムがプロセス管理の問題を既に解決していることに留意してください。従来、Linuxはsysvinitを使用していましたが、これは基本的にinit.dにあるスクリプトのコレクションです。しかし、それはかなり愚かでプロセスを監視できません。init.dスクリプトは複雑であり、正当な理由で置き換えられています。

最新のオペレーティングシステムがsysvinitに取って代わり始めており、フロントランナーはUpstartとSystemdです。Debianはsystemdに傾いており、Ubuntuが開発され、すでにUpstartに移行しています。DebianRedhat / CentOS / Fedoraのようにsystemdに向かっています。したがって、sysvinitを既に置き換えたOSを使用している場合は、組み込みのものを使用することをお勧めします。スクリプトは、initスクリプトよりもはるかに簡単に記述できます。

私はrunitを使用しましたが、非常に気に入っていますが、最も使いやすいのはスーパーバイザーです。また、非常によく文書化されており、ほとんどどこでも動作し、すべての主要なディストリビューションにパッケージされています。

しかし、あなたが何をするにしても、どうぞ、シェルスクリプトを使わないでください。そのアプローチには多くの間違いがあります!


sysvinitでそれを行う方法?
horseyguy

12

iptables実際には実行されているサービスやデーモンではなく、カーネルの一部であるため、悪い例です。実際に「停止」することはできません。iptables構成のみを指定でき、「停止」するには空の構成を指定する必要があります。実際、Linuxシステムがクラッシュしましたが、ポートフォワーディングのセットアップiptablesは引き続き機能します。

とにかく、呼び出されたユーティリティはmonitあなたが望むことをします。Debianを使用している場合、それはapt-get install monit離れています。学ぶことは少し複雑ですが、非常に柔軟です。


3

この単純なスクリプトを使用してアラートを作成し、実行されていない場合はサービスを開始しています。さらにサービスを追加することもできます。

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null

MariusMatutiaeのポイントは正しいのですが、サーバーでHTTPDおよびDNSサービスを監視するための簡単なスクリプトを作成しました。サービスがダウンすると、スクリプトがサービスを再起動してアラートを出します。サービスに関するアラート/メールが大量に得られたら、調査を行うことができます。
ランジトクマールT


0

質問されてから数年が経ちました。ただし、systemd(ほとんどの場合、centosおよびREHLで使用可能)を使用すると、cronでこのbashコマンドを実行して、サービスが停止した場合に確認および再起動できます。

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

binディレクトリに保存し、monitorのように名前を付けます。適切なファイル許可をそれに与えます。のように実行します

sudo monitor redis

redisサービスを確認し、必要に応じて再起動/開始する場合。

最後に、これをcronジョブに追加します。

これが役立つことを願って


0

init / svc監視の長いリストに追加するために、S6のサブディレクトリとして、ブロックに新しい子があります。66は、s6サービス管理とログを高速で、ユーザーフレンドリーな方法で処理します。これは、Obarun-Linux https://web.obarun.org/softwareの公式ドキュメントへのリンクです

これは、この66ソフトウェアの使用方法とs6の意味を理解するためのFAQですhttp://sysdfree.wordpress.com/266

安定版リリースでは、4.20-> 5.0からのカーネルの変更に関連するバグが1つしか検出されなかったため、報告された他の問題はすべて、何か新しいことを学ぶ人に関係していました。サービス管理をこれよりも簡単にする必要がある場合は、ms-windowsに切り替える方が良いかもしれません(Linus forbid)。これがどのように機能するかを実際の生活で見るには、Obarun live.isoをダウンロードして、遊ぶだけです。サービスをインストールし、66スクリプトを使用してサービスを有効化、強制終了、ログを表示、停止および開始(有効化中)、サービスをツリーにまとめてサービスのツリーをすべて開始および停止し、ユーザーレベルのサービスを個別に保持システムから。それはs6がうまくやることをし、ユーザーがs6の下で防弾システムを悪用することをより簡単にします。

画像のダウンロードは、https: //web.obarun.org/index.php ?id = 74 md5 check files https://repo.obarun.org/iso/で確認できます

initおよびサービス管理を除き、s6 / 66はシステム上の他の要素からの依存関係を持ちません。これは基本システムの層であり、ソフトウェアの残りの部分はinit / svc-mgmtブラインドで独自に動作します。すべてのs6と66はCで書かれており、Linux固有でもglibc固有でもありません。Skarnet(s6 authors)のサーバーは、muslカスタムビルドシステムで多くの一時停止をせずに10年近く実行されています。現在、Alpine、Void、およびAdelieのリポジトリにはs6ソフトウェアがあり、Adelieはデフォルトでサービス監視に使用します。Voidには現在66もあります。誰がs6をxxBSDまたは他のxxIXシステムに移植したか、そしてどの程度まで拡張したかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.