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などから定期的に実行してやれば、モニターがキャプチャできてないと判断したら再起動してくれます。
今のところ上記でうまく動作しており、モニターが落ちっぱなしという状況はなくなりました。
その他
よくあるトラブルと解決方法は以下にまとめました。
コメントフォーム