実行中の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でインストールすればシャットダウンできるようになります。