【Windows】Windows Server バックアップの特定のシャドウコピーを消したい

背景

Windows 2008 から標準搭載されている「Windows Server バックアップ」ですが、コマンドラインでも動かせて、昔の「NT バックアップ」よりはるかに使い勝手が良いです。

ただ、履歴管理はできなく、ネットワーク越しに取得すると 1 世代しかとれないわ(標準では)、履歴管理はできないわと、ファイルサーバーのバックアップにはあまり向かないようです。

が、標準ですので使っている方も多々いらっしゃいます。

専用ボリュームに取得すれば、古いシャドウコピーも勝手に消されるので、これはこれで便利。のはずなのですが、まれに古いシャドウコピーが削除されずに「保存対象がいっぱいです」みたいな感じでバックアップが永遠に取得できなくなることがあります。

経験上、OS のバージョンが上がっても解消されていないので、ここでは古いシャドウコピーを削除する方法をまとめておきます。

設定内容(画面ショットは Windows 2008 R2 ですが、2012/2016 でも大丈夫です)

1.最初にシャドウコピーの履歴を確認します

コマンドプロンプトから、以下のコマンドを実行します

・vssadmin list shadows /for=<BackupTarget>

<BackupTarget>:Windows Server バックアップで保存先にしているボリューム名です。
Z: とかです

※上記の場合は履歴が一つしかありませんが、状況によっては複数あることもあります。その場合は、結果を以下のようにリダイレクトすると以降の作業時に楽です。

・vssadmin list shadows /for=<BackupTarget> > C:\user\administrator\desktop\vsslist.txt

2.消したいシャドウコピーの「シャドウコピーID」を確認します

項番1 で指定したボリュームに存在するシャドウコピーの一覧で、削除対象のシャドウコピーの「シャドウコピーID」を確認します

シャドウ コピー ID: {be9243d9-42f7-41d8-aa22-7b18e71a0062}

 3.diskshadow ユーティリティを起動します

コマンドプロンプトを開き、以下のコマンドを実行します

・ Diskshadow

4.シャドウコピーを削除します

項番2 で確認した「シャドウコピーID」を削除します。

DISKSHADOW> の後に、以下のコマンドを入力します。

・DELETE SHADOWS ID <削除したいシャドウコピーID> <ターゲットボリューム名>

項番1 を例にすると、以下のようになります。

・DELETE SHADOWS ID {be9243d9-42f7-41d8-aa22-7b18e71a0062} G:

5.余談

項番4 でシャドウコピーを消す際に、「一番古いのを消したい」とか「ぜんぶ消してしまいたい」とかの場合は、そういうオプションも用意されてます。

例えば、「一番古いシャドウコピーを消したい」のでしたら、以下のコマンドで OK です。一番古い[10 世代分]を消したければ、このコマンドを 10 回繰り返すことで実現できます。

・DELETE SHADOWS OLDEST G:

DELETE SHADOWS { ALL | VOLUME <ボリューム> | OLDEST <ボリューム> | SET <セット I
D> | ID <シャドウ ID> | EXPOSED <ドライブ文字、マウント ポイント、または共有> }

シャドウ コピー (永続と非永続の両方) を削除します。

ALL すべてのシャドウ コピー。
 VOLUME <ボリューム> 指定したボリュームのすべてのシャドウ
 コピーを削除します。
 OLDEST <ボリューム> 指定したボリュームの最も古いシャドウ
 コピーを削除します。
 SET <セット ID> <セット ID> パラメーターで指定した
 シャドウ コピー セット内のシャドウ コピーを削除します。
 ID <シャドウ ID> <シャドウ ID> パラメーターで指定した
 シャドウ コピーを削除します。
 EXPOSED <露出名> 指定したドライブ文字、マウント ポイント、
 または共有に露出しているシャドウ コピーを削除します。

例: DELETE SHADOWS ALL
 DELETE SHADOWS EXPOSED p:
 DELETE SHADOWS EXPOSED 共有名

【Zabbix】Windows のプロセス監視で「コマンドライン」まで指定したい

背景

Zabbix のアイテムとしてプロセス数を取得する「proc.num[xxxx]」があります。

こちらは純粋に「上がっているプロセス数」を返してくれます。

Zabbix のマニュアルによると、オプションがいろいろあるのですが、Windows だと制限がありまして、コマンドラインを指定して値を取得することが出来ないんです。

URL↓

https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtypes/zabbix_agent

でも、同じプロセス名(例えば java.exe)でも、コマンドラインまで確認して監視したい、なんて要望はあります。

こちらの設定、非常に簡単で設定できるので、こちらに記載します。

設定内容(画面ショットは 2.0 ですが、3.0 系でも大丈夫です)

1.最初にアイテムを作成します

対象のホストにて、[アイテム]を選択し、右上にある「アイテムの作成」ボタンを押します。

以下の画面のように作って頂ければと。

名前:Process_java.exe-1(任意です)
タイプ:Zabbixエージェント
キー:java1_procnumcheck(任意です。が、ホスト内でユニークになるように設定する必要があります)

2.ホスト側の[zabbix_agent.conf]を修正します

Zabbix Agent をインストールしたフォルダにある zabbix_agent.conf をエディター(Windows 標準なら、ワードパッドが良いです)で開きます。

セクション[UserParameter]部分に、以下のように追記します。

・UserParameter=java1_procnumcheck,wmic process where “name = \”java.exe\”” get commandline | find /v “CommandLine” | find /c “特定する文字列”

### Option: UserParameter
# User-defined parameter to monitor. There can be several user-defined parameters.
# Format: UserParameter=<key>,<shell command>
# Note that shell command must not return empty string or EOL only.
# Example: UserParameter=system.test,echo 1
UserParameter=java1_procnumcheck,wmic process where "name = \"java.exe\"" get commandline | find /v "CommandLine" | find /c "特定する文字列"

何を記載しているかと言うと、文法に則ってます。

文法:UserParameter=<key>,<command>

<key>には、項番1 で作成した「キー」を記載します。これで、対応した「キー」に対してアイテムをホスト側からサーバーへ送ることが出来ます。

<command>には、取得したい「値」を 1 行コマンドラインで取得できるように記載します。この場合は、wmic コマンドを使って、[java.exe]のコマンドラインを取得して、このプロセスでしか使っていない「文字列」を検索して、行数をカウントしてます。

Windows に関しては、値を取得するコマンドを 1 行で記載できれば、以外と簡単に取得できます。コマンドはいろんな方がブログ等で公開してくれているので、まずググってみましょう。

3.仕上げ

項番2 のように[zabbix_agent.conf]を記載できたら、Zabbix Agent のサービスを再起動しましょう。でないと、設定が反映されないです(よく忘れます)。

希望通りの「値」が取得できていることを確認できれば、あとはこのアイテムに対してトリガーをセットすれば、OK です。

【Zabbix】通常のアイテム設定で取得できないプロセス数を取得する

背景

Zabbix のアイテムとしてプロセス数を取得する「proc.num[xxxx]」があります。

正しいプロセス名を指定しているにもかかわらず、取得できないことがあります。

いろんな方から同じような質問を頂くのですが、非常に簡単で設定できるので、こちらに記載します。

設定内容(画面ショットは 3.0 ですが、2.0 系でも大丈夫です)

0.作業の前に

今回監視しようとしているのは、例えば[Dovecot]を動かしているときに起動しているはずの[dovecot/anvil]です(以下のコマンド結果を参照。一部伏せ字)。

こちらを Zabbix のアイテムで「proc.num[“dovecot/anvil”]」を作っても、取得できない場合がありました

# systemctl status dovecot.service
dovecot.service - Dovecot IMAP/POP3 email server
 Loaded: loaded (/lib/systemd/system/dovecot.service; enabled)
 Active: active (running) since Tue, 15 Nov 20xx tt:mm:ss +0900; 16s ago
 Main PID: xxxx (dovecot)
 CGroup: name=systemd:/system/dovecot.service
 ├ xxxx /usr/sbin/dovecot -F
 ├ xxxx dovecot/anvil
 ├ xxxx dovecot/log
 └ xxxx dovecot/config

 

1.最初にアイテムを作成します

対象のホストにて、[アイテム]を選択し、右上にある「アイテムの作成」ボタンを押します。

以下の画面のように作って頂ければと。

名前:Process_dovecot_anvil(任意です)
タイプ:Zabbixエージェント
キー:dovecot_anvil_procnumcheck(任意です。が、ホスト内でユニークになるように設定する必要があります)

2.ホスト側の[zabbix_agent.conf]を修正します

/etc/zabbix/zabbix_agent.conf を vi とかで開きます。

セクション[UserParameter]部分に、以下のように追記します。

・UserParameter=dovecot_anvil.procnumcheck,ps aux | grep “dovecot/anvil” | grep -v “grep” | wc -l

### Option: UserParameter
# User-defined parameter to monitor. There can be several user-defined par
ameters.
# Format: UserParameter=<key>,<shell command>
# See 'zabbix_agentd' directory for examples.
#
# Mandatory: no
# Default:
# UserParameter=
UserParameter=dovecot_anvil.procnumcheck,ps aux | grep "dovecot/anvil" | grep -v
 "grep" | wc -l

何を記載しているかと言うと、文法に則ってます。

文法:UserParameter=<key>,<command>

<key>には、項番1 で作成した「キー」を記載します。これで、対応した「キー」に対してアイテムをホスト側からサーバーへ送ることが出来ます。

<command>には、取得したい「値」を 1 行コマンドラインで取得できるように記載します。この場合は、aux コマンドを使って、[dovecot/anvil]が上がっているかを確認した後に、その「行数」を返すように記載してます。

3.仕上げ

項番2 のように[zabbix_agent.conf]を記載できたら、Zabbix Agent をリスタートしましょう。でないと、設定が反映されないですね。

希望通りの「値」が取得できていることを確認できれば、あとはこのアイテムに対してトリガーをセットすれば、OK です。

 

【Zabbix】アクション設定のメール内容を、ログに記録する

背景

Zabbix で設定しているアクションのメール送信内容を「ログ」に記録して、そちらをログ監視で確認するという要件がありました。

いろいろ調べてみると、断片的に情報をアップして頂いている方がいらっしゃったので、それを組み合わせて実現できました。

備忘録として、こちらにまとめておきます。

設定内容(画面ショットは 2.0 ですが、3.0 系でも大丈夫です)

1.最初にメディアを作成します

メニューより、[管理]→[メディアタイプ]を選択し、右上にある「メディアの新規作成」ボタンを押します。

以下の画面のように作って頂ければと。

メディア設定

名前:monitor_log(任意です)
タイプ:スクリプト
スクリプト名:zabbix_monitor.sh(任意です。ただし、
パスは、./usr/lib/zabbix/alertscripts/ に保存してください)
有効:チェック

2.スクリプトを準備します

以下のようなシェルを作って、[./usr/lib/zabbix/alertscripts/ ]に、項番1 で記載した「スクリプト名」で保存します

DATESTR=`date "+%Y/%m/%d %T"`
META=$2
UNIFIED_LOG=/var/log/zabbix/zabbix_monitor.log
/bin/echo "$DATESTR $META" >> $UNIFIED_LOG 2>&1

※スクリプト内の[META]という変数に[$2]をセットしてます。この[$2]は、アクション設定の「デフォルトの件名」部分に該当します

3.ユーザーを追加します

項番1 で作成したメディアを、ユーザーにセットします

タイプ:monitor_log(項番1で作成したものです)
送信先:zabbix

4.「アクションの実行条件」に追加します

項番3 で作成したユーザーに対して、「アクションの実行条件」で[ユーザーにメッセージを送信: zabbix-monitor]をセットします。

こうすることで、アクションがキックされた際に、[/var/log/zabbix/zabbix_monitor.log]に記載されるようになります