我用无业游民的发展。我忘了关闭一些虚拟机。当我退出主机时,Ubuntu关闭进程似乎挂起。
可能有一种方法可以用一些命令行赋来关闭所有无聊的盒子吗?类似于以下内容,但可以正常工作。
for f in $HOME/vagrant;
do;
cd $f
vagrant halt
done;
我用无业游民的发展。我忘了关闭一些虚拟机。当我退出主机时,Ubuntu关闭进程似乎挂起。
可能有一种方法可以用一些命令行赋来关闭所有无聊的盒子吗?类似于以下内容,但可以正常工作。
for f in $HOME/vagrant;
do;
cd $f
vagrant halt
done;
Answers:
为了对Virtual Box计算机进行脚本化控制,我们可以使用VBoxManage命令:
列出正在运行的计算机(返回名称和UUID):
VBoxManage list runningvms
通过“休眠”虚拟机来停止运行(建议避免丢失数据)
VBoxManage controlvm <name|uuid> savestate
关闭正在运行的VM的电源(不建议这样做,因为我们可能会丢失来宾中的数据)
VBoxManage controlvm <name|uuid> poweroff
在支持ACPI的来宾操作系统中使用ACPI(最好poweroff
是正常关闭来宾)
VBoxManage controlvm <name|uuid> acpipowerbutton
另请参阅:如何使用命令行安全关闭VirtualBox中的Guest OS
根据下面选择的正确答案,我添加了bash脚本“ $HOME/bin/stop-vagrant.sh
”。因此,现在我有了一些可以安全地停止所有闲置虚拟机的功能,这些虚拟机我可能已经打开但在会话中忘记了。
vboxmanage list runningvms | sed -r 's/.*\{(.*)\}/\1/' | xargs -L1 -I {} VBoxManage controlvm {} savestate
vboxmanage list runningvms |
-获取VirtualBox下所有正在运行的虚拟机的列表
sed -r 's/.*\{(.*)\}/\1/' |
-将字符串剥离为ID号
xargs -L1 -I {} VBoxManage controlvm {} savestate
-在打开的每个框上运行save state命令。
上 xargs
-L1
-一次乘一行 -I {}
-使用{}作为下一个命令的占位符-r
选项对于GNU Sed是唯一的。
-E
而不是-r
。这是使用扩展正则表达式的标志。
另一个答案对处理Virtualbox很有帮助,但是Vagrant具有自己的处理虚拟机的机制,正如其中一条评论中提到的那样,它不仅仅支持VirtualBox,现在还支持VMWare,但后来知道!
这似乎为我工作:
vagrant global-status | awk '/running/{print $1}' | xargs -r -d '\n' -n 1 -- vagrant suspend
注意:
这适用于1.6以后的Vagrant版本,对于较旧的版本,您应该升级,但如果不能升级,则专注于Virtualbox的其他选项之一可能会更好。
global-status
命令在Vagrant 1.6中引入。使用旧版本Vagrant的用户,尤其是通过Vagrant安装apt-get
并可能仍在1.4.3上的用户,需要先更新其Vagrant安装,然后才能使用此命令。
xargs
不支持-r
,因此您可以gxargs
通过安装brew
并使用它。
我的机制是:
vagrant global-status | grep virtualbox | cut -c 1-9 | while read line; do echo $line; vagrant halt $line; done;
virtualbox
(过滤掉帮助文本,如果使用其他提供程序,则将中断)vagrant halt $line
停止流浪的全球唯一的ID这比上面的Virtualbox方法更好,因为它也会运行任何由vagrant配置的关机机制。
sed
和之间在命令行参数处理方面存在差异awk
。谢谢!
vagrant suspend
而不是vagrant halt
保存状态并暂停以更快地上下移动。
如果其他人遇到这个问题:对于使用VirtualBox的用户,它已经可以解决这个问题,只涉及编辑文件:
# Contents of /etc/default/virtualbox
# ...
# ...
# SHUTDOWN_USERS="foo bar"
# check for running VMs of user 'foo' and user 'bar'
# 'all' checks for all active users
# SHUTDOWN=poweroff
# SHUTDOWN=acpibutton
# SHUTDOWN=savestate
# select one of these shutdown methods for running VMs
# acpibutton and savestate causes the init script to wait
# 30 seconds for the VMs to shutdown
## My original values
# SHUTDOWN_USERS=""
# SHUTDOWN=poweroff
## My current values
SHUTDOWN_USERS="all"
SHUTDOWN=savestate
这样做的好处是不必编辑/创建任何注销或init.d
分段来运行其他答案中发布的命令。缺点是该解决方案特定于VirtualBox。
在Ubuntu 14.10上使用VirtualBox 4.3.18进行了测试。
所有的功劳都归这个职位。
结合其他一些答案,这将关闭所有正在运行的virtualbox vagrant box:
vagrant global-status | awk '/virtualbox running/{ print $1 }' | xargs vagrant halt
如果您要编写脚本来解析Vagrant命令,则建议解析--machine-readable
更友好的机器友好输出()。
格式为:
timestamp,target,type,data...
因此,由于它是逗号分隔的,因此可以将其导入为CSV文件。
使用shell,可能更难解析,例如:
for id in $(vagrant global-status --machine-readable | cut -d, -f5 | grep -B3 running | egrep -o "[0-9a-f]{7}"); do
vagrant suspend $id;
done
请参阅:无业游民-机器可读的输出
但是我发现更容易解析标准输出,例如
while read id name provider state path; do
[ "$state" = "running" ] && vagrant suspend $id;
done < <(vagrant global-status)
顺便说一句。理论上,该vagrant
命令应根据此GH post接受要挂起的VM列表的正则表达式,例如:
vagrant suspend '*'
但是它不起作用,并且存在一个错误#7221,该错误正在等待修复。
相关GitHub门票:
这可能对您有效或无效;-)对我有效
#!/usr/bin/env bash
if [ -z "$1" ]
then
OPTS=""
else
# force close if any arg passed
OPTS="-f"
fi
for i in $(vagrant global-status | grep running | awk '{print $1}'); do
DIR=$(vagrant global-status | grep running | awk '{print $5}')
cd "$DIR";
OUT=$(vagrant halt);
echo "attempted to halt $i: $OUT"
done