Zoneminderのモニターステータスの確認と再起動(コマンドライン&シェルスクリプト)

スポンサーリンク

ZoneminderのWebコンソールで映像が映っていて、ステータスを示す丸のアイコンが緑であれば正常と判断できます。

ここではコマンドでのモニターの稼働状況確認と、モニターの再起動コマンドについてメモしていきます。

Zoneminderの自動チェック&デーモン再起動

Zoneminderは各種デーモンをチェックしており、異常があれば再起動してくれるので、モニターが停止したとしても自動で再起動してくれます。

しかし、環境によるものなのか、普段は正常に再起動してくれるので復帰しますが、まれに復帰せずモニターが停止したままになる事があり、これについては次項以降で説明します。

以下が該当する設定項目です。

MAX_RESTART_DELAY

再起動ごとの遅延(再起動ループの防止など)

WATCH_CHECK_INTERVAL

キャプチャーデーモンのチェック周期

WATCH_MAX_DELAY

最後のキャプチャから異常と判断するまでの時間

zmdc.pl

Zoneminderはデーモンコントロール用に「zmdc.pl」というスクリプトが付属しており、

全モニターのデーモン稼働状況確認

デーモンの稼働状況を確認する場合は以下のコマンドを実行します。

パスは通っていると思いますが /usr/bin/zmdc.pl でした。

zmdc.pl status

コマンドを実行すると以下のようなリストが得られます。

先頭が「zmc」となっているのがキャプチャー(Capture)プロセスで、映像を取得しており、「zma」というのは動体検知の解析(Analys)を行うプロセスです。

'zmc -m 1' running since 20/11/15 10:00:05, pid = 588, valid
'zma -m 7' running since 20/11/11 15:55:53, pid = 6938, valid
'zmc -m 6' running since 20/11/09 12:43:57, pid = 13775, valid
'zmc -m 10' running since 20/11/15 10:34:09, pid = 9164, valid
'zmc -m 9' running since 20/11/09 12:43:58, pid = 13794, valid
'zma -m 8' running since 20/11/15 10:35:36, pid = 12137, valid
'zmfilter.pl --filter_id=2 --daemon' running since 20/11/09 12:43:58, pid = 13809, valid
'zma -m 2' running since 20/11/15 10:00:02, pid = 351, valid
'zma -m 4' running since 20/11/15 10:00:07, pid = 667, valid
'zma -m 1' running since 20/11/15 10:00:05, pid = 592, valid
'zmc -m 2' running since 20/11/15 10:00:02, pid = 333, valid
'zmstats.pl' running since 20/11/09 12:43:59, pid = 13836, valid
'zmc -m 8' running since 20/11/15 10:35:31, pid = 11934, valid
'zmc -m 4' running since 20/11/15 10:00:06, pid = 631, valid
'zmtelemetry.pl' running since 20/11/09 12:43:59, pid = 13832, valid
'zma -m 9' running since 20/11/09 12:43:58, pid = 13799, valid
'zmc -m 7' running since 20/11/11 15:55:53, pid = 6926, valid
'zmc -m 3' running since 20/11/15 10:00:05, pid = 604, valid
'zmwatch.pl' running since 20/11/09 12:43:59, pid = 13822, valid
'zma -m 3' running since 20/11/15 10:00:10, pid = 736, valid
'zmfilter.pl --filter_id=3 --daemon' running since 20/11/09 12:43:58, pid = 13816, valid
'zma -m 6' running since 20/11/09 12:43:57, pid = 13778, valid
'zmfilter.pl --filter_id=1 --daemon' running since 20/11/09 12:43:58, pid = 13805, valid
'zma -m 10' running since 20/11/15 10:34:12, pid = 9248, valid

「running since ~」となっていればプロセスは正常に動いていますが、これはプロセスが正常に稼働しているという事で実際にキャプチャできているかは別です。

例えば以下の「モニターID 8」は「running」となっていますが、実際には映像が取得できていない状態でした。

'zma -m 8' running since 20/11/15 10:35:36, pid = 12137, valid
'zmc -m 8' running since 20/11/15 10:35:31, pid = 11934, valid

個別に確認

「zmc -m 8」のようにモニターIDを指定して個別に確認できます。

zmdc.pl status 'zmc -m 8'

実行すると以下のように返ってきます。

'zmc -m 8' running since 20/11/13 12:00:02, pid = 15516

ただ、以下のようにgrepしても同じなので、どちらでもOKです。

zmaとzmcの両方の場合

zmdc.pl status | grep "m 8"

実行結果

'zma -m 8' running since 20/11/15 10:43:24, pid = 28753, valid
'zmc -m 8' running since 20/11/15 10:43:23, pid = 28641, valid

キャプチャーデーモンの再起動

これも同様にモニターIDを指定して実行します。

zmdc.pl restart zmc -m [モニターID]

モニターIDが8の場合は以下のように実行します。

zmdc.pl restart zmc -m 8

実行結果

Restarting zmc -m 8
'zmc -m 8' sending stop to pid 2892 at 20/11/11 09:37:35

設定は正常に済んでいる状態で映像が取得できなくなった場合、これでモニターを再起動してやると正常に取得できるようになります。

API経由でモニターステータス取得(ブラウザから)

「zmdc.pl」はデーモンが稼働しているかどうかしか分かりませんでしたが、APIが有効になっていればjson形式で各モニターの情報が取得できます。

Zoneminderへの各種操作(再起動や設定変更など)も行えますが、ここではモニターの状況の確認について説明します。

取得できるデータはjson形式になっており、Firefoxなどのブラウザからアクセスすると整形してくれるので非常に見やすいです(元のデータは全部1行に詰め込まれています)

APIが稼働しているか確認

以下の [ホスト名] を自身のサーバと置き換えてアクセスしてみます。

これでバージョンが返ってきたらAPIは正常に稼働しています。

https://[ホスト名]/zm/api/host/getVersion.json

全モニター情報

モニター情報はステータスから設定内容まで全て返ってきます。

https://[ホスト名]/zm/api/monitors.json

モニターの情報(個別)

指定したモニター情報のみ返ってきます。

https://[ホスト名]/zm/api/monitors/[モニターID].json

モニターのzmcステータス

これで返ってくるのは、「zmdc.pl」で「zmdc.pl status ‘zmc -m 8’」などとしたものと同じです。

https://[ホスト名]/zm/api/monitors/daemonStatus/id:[モニターID]/daemon:zmc.json

API経由でモニターステータス取得(コマンドラインから)

API経由の「Monitor_Status」と「zmdc.pl status」の違い

「zmdc.pl status」では「running」や「pending」のステータスが確認できましたが、あくまでキャプチャーデーモンが正常に動作しているかどうかのため、カメラ映像が取得できていないトラブル時でもデーモンさえ動いていれば「running」が返ってきてしまいます。

API経由の「Monitor_Status」はRTSPストリーミング映像を正常にキャプチャできている場合「Connected」が返り、モニターが落ちている場合は「NotRunning」、未接続で映像が取得できていない場合は「Running」が返ってきます。

Zoneminderがうまくキャプチャデーモンを再起動してくれない場合があるため、このステータスを定期的に確認し、「zmdc.pl restart XXXX」で再起動すれば良さそうです。

全モニターの情報を取得

ブラウザでのアクセスは、ZoneminderのWebコンソールにログインしていれば「ユーザー名」や「パスワード」は省略できましたが、コンソールからの実行では認証情報も一緒に渡してやる必要があります。

curl -s 'https://[ホスト名]/zm/api/monitors.json?user=[ユーザー名]&pass=[パスワード]'

生のデータは1行に詰め込まれていますが、Pythonのjson.toolを使うと見やすく整形されたものが取得できます。

curl -s 'https://[ホスト名]/zm/api/monitors.json?user=[ユーザー名]&pass=[パスワード]' | python -mjson.tool

非常に長いので省略しますが、以下のようなデータが返ってくるはずです。

{
   "monitor": {
      "Monitor": {
      "AlarmFrameCount": "1",
      "AlarmMaxFPS": null,
      "Height": "944",
      "Host": "admin@192.168.251.254",

      ~省略~

      "WeekEvents": "1808",
      "Width": "1440",
      "ZoneCount": "12"
      },
      "Monitor_Status": {
      "AnalysisFPS": "3.16",
      "CaptureBandwidth": "337635",
      "CaptureFPS": "22.22",
      "MonitorId": "8",
      "Status": "Connected"
      }
   }
}

個別のモニター情報を取得

curl -s 'https://[ホスト名]/zm/api/monitors/[モニターID].json?user=[ユーザー名]&
pass=[パスワード]' | python -mjson.tool

指定IDのモニターステータスだけ取り出す

返ってくるモニターIDのjsonには “Status”:”Connected” というステータスがありますのでこれを取り出します。

curl -s 'https://[ホスト名]/zm/api/monitors/[モニターID].json?user=[ユーザー名]&pass=[パスワード]' | grep -zoP "(?<=\"Status\":\").*?(?=\")"

モニターが正常にキャプチャしている場合は以下のように「Connected」とだけ返ってきます。

シェルスクリプトに書いてcronで定期的に実行してやれば監視と再起動ができそうですね。

Connected

シェルスクリプトの例

モニターの状態を表示

array=(1 2 3 4 6 8 9 10) にはチェックするモニターIDを半角スペース区切りで列挙します。

「test.sh」など適当なファイル名にして実行してみます。

# モニターIDを列挙
array=(1 2 3 4 6 8 9 10)

for v in "${array[@]}"
do
   # APIからモニターのStatusを取得&整形
   VAR=$(curl -s "https://[ホスト名]/zm/api/monitors/${v}.json?user=[ユーザー名]&pass=[パスワード]" | grep -zoP "(?<=\"Status\":\").*?(?=\")")

   # 表示してみる
   echo monitor $v is $VAR
done

実行結果

monitor 1 is Connected
monitor 2 is Connected
monitor 3 is Connected
monitor 4 is Connected
monitor 6 is Connected
monitor 8 is Connected
monitor 9 is Connected
monitor 10 is Connected

パラメータを変数で定義するようにすると以下のようになります。

モニターID、ホスト名、ユーザー名、パスワードを修正して実行すればステータスが返ってきます。

# モニターIDを列挙
array=(1 2 3 4 6 8 9 10)

# ホスト名
ZMHOST="XXXXX.com"

# Zoneminderのユーザー名
ZMUSER="XXXXX"

# Zoneminderのパスワード
ZMPASS="XXXXX"

for v in "${array[@]}"
do

   # APIからモニターのStatusを取得&整形
   VAR=$(curl -s "https://${ZMHOST}/zm/api/monitors/${v}.json?user=${ZMUSER}&pass=${ZMPASS}" | grep -zoP "(?<=\"Status\":\").*?(?=\")")

   # 表示してみる
   echo monitor $v is $VAR

done

Connectedでない場合はモニター再起動

ステータス確認スクリプトの末尾にステータスの判定と、「zmdc.pl restart」で指定モニターの再起動を追加しただけです。

「表示してみる」の行は残してありますが削除してもOKです。

# モニターIDを列挙
array=(1 2 3 4 6 8 9 10)

# ホスト名
ZMHOST="XXXXX.com"

# Zoneminderのユーザー名
ZMUSER="XXXXX"

# Zoneminderのパスワード
ZMPASS="XXXXX"

for v in "${array[@]}"
do

   # APIからモニターのStatusを取得&整形
   VAR=$(curl -s "https://${ZMHOST}/zm/api/monitors/${v}.json?user=${ZMUSER}&pass=${ZMPASS}" | grep -zoP "(?<=\"Status\":\").*?(?=\")")

   # 表示してみる
   echo monitor $v is $VAR

   # Connectedでない場合は再起動
   if [ "$VAR" != "Connected" ]; then
      zmdc.pl restart zmc -m $v
   fi

done

あとは上記のスクリプトをcrontabなどから定期的に実行してやれば、モニターがキャプチャできてないと判断したら再起動してくれます。

今のところ上記でうまく動作しており、モニターが落ちっぱなしという状況はなくなりました。

その他

よくあるトラブルと解決方法は以下にまとめました。

ZoneMinderのよくあるトラブルと解決方法(監視カメラシステム)
ZoneMinderはオープンソースの高機能な監視カメラソフトです。動画の記録はNVRへ、ZoneMinderは別途動体検知とスマホなどから画像として確認するために使用していますが、色々とトラブルがあったので解決方法をメモしておきま...

コメント

タイトルとURLをコピーしました