telnetの自動化
KVM(というかqemu)で-monitor telnet::4444,server,nowaitみたいなオプションを指定すると、モニタにtelnet接続できる。
telnetなので基本は対話的にコマンドを実行するしかないが、expectを使えばスクリプトに組み込むことができる。sleepとechoとパイプで頑張ってもいいけど。。virshとか使えばいいのにね!
4444はポート番号の例なので適宜読み替え。
# cat -v tlnt.sh #!/bin/sh HOST=$1 PORT=$2 shift;shift CMD=$* expect -c " set timeout 10 spawn telnet $HOST $PORT expect (qemu)\ ; send \"${CMD}\r\" expect (qemu)\ ; send \"^]\" expect telnet>\ ; send \"close\r\" " | tail -n +7 | head -n -2
下から3行目は「^]」ではなく「Ctrl+]」なので注意。
tailとかheadは決め打ち。引数は「ホスト」「ポート」「コマンド」の順。
たとえば
# tlnt.sh localhost 4444 info status VM status: running #
みたいな感じで使える。
使えるコマンドは
# tlnt.sh localhost 4444 help
で。
たとえば
# tlnt.sh localhost 4444 quit
でVMごと強制シャットダウンができたり、(途中で切れちゃうので注意)
# tlnt.sh localhost 4444 screendump screenshot.ppm
でスクリーンショットが取れる。
# for i in `tlnt.sh localhost 4444 info | awk '{ print $2 }'` do echo "### $i ###" tlnt.sh localhost 4444 info $i echo done
とすればinfo 〜で見れる全パラメータが吐き出せる。
別にtelnet先はlocalhostじゃなくてもいいので、-incomingオプション付きでプロセスを立ち上げてから自動でライブマイグレーションするようなスクリプトも作りこめると思う。