概要
Monit で複数のチェックを組み合わせるにはどうすればよいですか? プロセス アクティビティとファイル コンテンツ/タイムスタンプを確認したい。
長くて退屈な説明
Bukkit Minecraft サーバーを維持するための Monit デーモンに取り組んでいます。いくつかのチェックを行います。現時点では、次のコードがあります。
#!monit
check process bukkit pidfile /var/run/bukkit.pid # check if the java process is running
start program = "/sbin/start bukkit" # start with Upstart
stop program = "/sbin/stop bukkit" # stop with Upstart
if failed # send a noop request to check if the server responses
host cubixcraft.de port 20059 protocol http
and request "/api/call?method=runConsoleCommand&args=%5B%22noop%22%5D&key=d9c7f3f6be0c92c1b2725f0e5a3352514cee0885c3bf7e0189a76bbaf2f4d7a7"
with checksum e006695c8da58e03f17a305afd1a1a32
timeout 20 seconds for 2 cycles
then restart # restart if it fails
動作します...しかし遅いです。何か問題が発生した場合、サーバーが終了するまで 20 秒待たなければなりません。しかし、サーバーは時々リロード (構成の更新、メモリのクリーンアップなど) を行い、ほとんど遅延が発生しないため、そのタイムアウトが必要です。サーバーがないtimeout 20 seconds for 2 cycles
と、リロードするとすぐに終了します。
わかりました。実際に問題が発生した場合、サーバーが再起動するまで 20 秒待つのは問題ありません。しかし、ほとんどの場合 (何か問題が発生すると)、サーバー上のすべてのセキュリティ メカニズムが機能しなくなります。
そのため、サーバーが応答しない場合はすぐに再起動する方法を見つける必要がありますが、リロードするときに少し時間がかかります。
私はこのアプローチを取っています: サーバーは、コマンド (サーバーのステータスを確認するために使用するリロードや API 呼び出しを含む) が発行されると、ログファイルに何かを書き込みます。したがって、ログファイルのタイムスタンプは最後のコマンドのタイムスタンプです。リロード中、ファイルには何も書き込まれません。そのため、単純なタイムスタンプ チェックでリロードを検出でき、サーバーが現在リロードしている場合にのみ 20 秒を与えます。