6

概要

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 秒を与えます。

4

1 に答える 1

0

私は開始プログラムをオーバーライドすることでこれを行うことができました:

start program = "/bin/bash -c '/usr/bin/monit unmonitor bukkit; /sbin/start bukkit; sleep 20; /usr/bin/monit monitor bukkit'" with timeout 25 seconds

これは で機能していましmonit/5.5たが、monit/5.14では時々しか機能しません。プログラムを実行している間にmonit/5.14を受け取るので、実際に を実行する前に終了するのを待ちます。これは、起動が早すぎて拒否されることを意味します。unmonitorstartstartunmonitormonitor

于 2015-12-29T05:35:14.510 に答える