技術メモなど

ほぼ自分用の技術メモです。

実行中のKVMゲストをまとめてシャットダウンするシェルスクリプト

KVMホストサーバをshutdownする前にKVMゲストをshutdownしたい時、一ゲストごとにコマンド打つのはちょっと面倒になってきたので、一回のシェルスクリプト実行でKVMゲストを全部シャットダウンできるようにしてみました。

シェルスクリプトの内容は次の通りです。

#!/bin/bash
for var in `/usr/bin/virsh list --all | egrep 'running$|実行中$' | awk '{print $2}'`
do
  echo "virtual machine $var is going to shutdown..."
  /usr/bin/virsh shutdown $var
done

以下解説。

シェルスクリプトのfor構文は、コマンドの実行結果を変数に代入することができるので、virsh listコマンドの出力からKVMゲストのドメイン名のみ抽出して変数に渡す→変数と組み合わせてvirsh shutdownコマンドを完成させて実行、という内容です。

コマンドvirsh list --allを実行すると次の出力が返ります。

[hoge@kvm ~]$ sudo virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     docker                         running
 2     proxy                          running
 3     router                         running
 -     www                            shut off

実行中のKVMゲストはState(状態)が「running(日本語環境だと「実行中」)」となるので、virsh list --allの出力からまずはegrepで行末が「running」か「実行中」になっている行を抽出し、パイプでawkへ渡します。2項目目がKVMゲストのドメイン名なので、awkで$2だけをprintします。結果、実行中のKVMゲストのドメイン名のみが出力されることになります。

後はfor構文に出力を渡せば、ここでは変数varにKVMゲストのドメイン名が代入されるので、変数varをvirsh shutdownコマンドの引数にするようにすれば、ループで全ての実行中のKVMゲストのvirsh shutdownコマンドが実行される仕組みです。

簡単な小ネタなので、例外処理とか一切考慮していません。

ちなみに、KVMゲストがCentOS6で、virsh shutdownコマンドでシャットダウンできない場合、acpidをyumでインストールすればシャットダウンできるようになります。