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

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

実際のところ、シェル スクリプトを使用する必要があるのか​​、それともすでにいくつかの方法があるのか​​どうかはよくわかりません。しかし、どのようなアプローチを使用するにしても、サービスを常に実行し続けたいと思います。

たとえば、次のような場合ですapache2

  • いつでもサービスapache2が停止しているか実行されていない場合は、自動的に開始 (または再起動) されるようにします。
  • もっと簡単に言えば、私はサービス常に稼働しています。

(チェックする頻度をある程度決められるかもしれないが、リアルタイムチェック問題は、5分ごとに行うということです。

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

  • 何か賢い解決策はありますか?

ありがとう!

答え1

2018年3月更新

この回答は今ではかなり古く、執筆以来systemdはLinuxのpid1戦争に勝利しています。したがって、おそらくシステムsystemd がディストリビューションに組み込まれている場合 (ほとんどのディストリビューションに組み込んでいる場合)、ユニットになります。

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


上記の monit の回答は有効ですが、いくつかの代替案を挙げてみたいと思います。

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

より新しいオペレーティング システムが sysvinit に取って代わり始めており、その先頭に立っているのが Upstart と Systemd です。Debian は systemd に傾きつつあり、Ubuntu は開発されてすでに Upstart に移行しており、Debian と同様に Redhat/CentOS/Fedora も systemd に移行しています。したがって、すでに sysvinit に取って代わった OS を使用している場合は、組み込みのものを使用することをお勧めします。スクリプトは init スクリプトよりも書きやすいです。

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

しかし、何をするにしても、シェル スクリプトは絶対に使用しないでください。このアプローチには多くの問題があります。

答え2

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

答え4

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 は禁止しています)。これが実際にどのように機能するかを確認するには、Obarun live.iso をダウンロードして操作するだけです。サービスとその 66 スクリプトをインストールして、サービスを有効化、強制終了、ログの表示、停止、起動 (有効な場合) を実行し、サービスをツリーにまとめて、サービス ツリーをまとめて起動および停止し、ユーザー レベルのサービスをシステムとは別にします。これは s6 が得意とすることを実行し、ユーザーが s6 の防弾システムを悪用することをより簡単にします。

画像のダウンロードはこちらから:https://web.obarun.org/index.php?id=74 md5 チェックファイルhttps://repo.obarun.org/iso/

init とサービス管理を除き、s6/66 はシステム上の他のものに依存しません。これはベース システムのレイヤーであり、残りのソフトウェアは独自に動作し、init/svc-mgmt は無視されます。s6 と 66 はすべて C で記述されており、Linux 固有でも glibc 固有でもありません。Skarnet (s6 の作者) のサーバーは、musl のカスタム ビルド システムでほぼ 10 年間、ほとんど停止することなく稼働しています。Alpine、Void、Adelie も現在リポジトリに s6 ソフトウェアを持っており、Adelie はデフォルトでサービス監視にそれを使用しています。Void も現在 66 を持っています。誰かが s6 を xxBSD または他の xxIX システムに移植したかどうか、またどの程度移植したかはわかりません。

関連情報