我正在编写一个脚本,只有在关闭所有虚拟机后才会关闭我的服务器。我发现这样做最可靠的方法是:
ssh root@vmserver 'virsh list'
这会给我这样的东西:
Id Name State
----------------------------------------------------
2 DNSserver running
3 salt running
4 logserver running
5 webserver running
6 mail running
7 fileserver running
当所有虚拟机都关闭时,它只会显示:
Id Name State
----------------------------------------------------
所以我正在寻找一种方法让我的bash脚本等到列表为空,然后向服务器发出shutdown命令。我并不想依赖expect
,因为并非所有系统都拥有该命令。这就是我到目前为止所拥有的:
#!/bin/bash
# stuff to shutdown VMs here (snipped) #
output=$(ssh root@vmserver 'virsh list')
# need something here to strip out the header
[ "$output" == "" ] && shutdown -h now
我已尝试在grep
和sed
上使用各种变体,但我在破折号方面遇到错误。例如:
$ sed -i "Id Name State ----------------------------------------------------" $output
sed: unrecognized option '----------------------------------------------------'
答案 0 :(得分:3)
我只使用......
for VM in $(virsh list --state-running --name); do echo "shotdown $VM"; done
...在bash shell脚本中关闭所有我的vms。 “echo”的位置,你可以把你的关机代码!
答案 1 :(得分:1)
grep表示0或更多空格的行和一个数字(如果不是空的话),关闭:
[ -n "$(ssh root@vmserver 'virsh list' | grep -E '^\s*\d+')" ] && shutdown -h
grep表示0或更多空格和数字的行,如果1行或更多行匹配,则关闭:
[ "$(ssh root@vmserver 'virsh list' | grep -E '^\s*\d+' | wc -l)" -ge 1 ] && shutdown -h
删除输出的前两行并计算它们。如果存在行,则关闭。
我个人认为这是不安全的,因为它是不可预测的。没有办法知道前两行是什么
[ "$(ssh root@vmserver 'virsh list' | sed '1,2d' | wc -l)" -ge 1 ] && shutdown -h