我用流浪汉用于开发。我忘记关闭几个虚拟机。当我退出主机时,Ubuntu 关机过程似乎挂起了。
有没有办法用一点命令行来编写脚本关闭所有 vagrant 框?类似下面的方法,但效果很好。
for f in $HOME/vagrant;
do;
cd $f
vagrant halt
done;
答案1
对于 Virtual Box 机器的脚本控制,我们可以使用垂直框管理命令:
列出正在运行的机器(返回名称和 UUID):
VBoxManage list runningvms
通过“休眠”停止正在运行的虚拟机(建议避免数据丢失)
VBoxManage controlvm <name|uuid> savestate
关闭正在运行的虚拟机(不推荐,因为我们可能会丢失客户机中的数据)
VBoxManage controlvm <name|uuid> poweroff
在支持 ACPI 的客户操作系统中使用 ACPI(最好能
poweroff
正常关闭客户机)VBoxManage controlvm <name|uuid> acpipowerbutton
另请参阅:如何使用命令行安全关闭 VirtualBox 中的客户操作系统
来自 OP 的更新
根据下面选定的正确答案,我添加了此 bash 脚本“ $HOME/bin/stop-vagrant.sh
”。现在我可以安全地开始停止所有我可能已打开但在会话中忘记的 vagrant VM。
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
-- 在每个打开的框上运行保存状态命令。
在xargs
-L1
- 每次只取一行-I {}
- 使用 {} 作为下一个命令的占位符
答案2
另一个答案非常适合处理 Virtualbox,但是 Vagrant 具有其自己的处理虚拟机的机制,并且正如其中一条评论中所提到的,它支持的不仅仅是 VirtualBox,目前只支持 VMWare,但以后谁知道呢!
这似乎对我有用:
vagrant global-status | awk '/running/{print $1}' | xargs -r -d '\n' -n 1 -- vagrant suspend
笔记:
这适用于 1.6 之后的 Vagrant 版本,对于旧版本,您可能应该升级,但如果不能,那么专注于 Virtualbox 的其他选项之一可能会更好。
答案3
我的机制是:
vagrant global-status | grep virtualbox | cut -c 1-9 | while read line; do echo $line; vagrant halt $line; done;
- global-status 列出所有框
- 过滤包含以下内容的行
virtualbox
(过滤掉帮助文本,如果您使用其他提供程序,则会中断) - 过滤仅显示前 9 个字符(全局唯一 ID)
- 虽然我们仍然可以从该输入中读取一行,但将其读取为变量 $line,然后:
- 打印出该$line
- 运行
vagrant halt $line
并停止 vagrant 以获取该全局唯一 ID
这比上面的 Virtualbox 方法更好,因为它也可以运行任何 vagrant 配置的关闭机制。
答案4
结合其他一些答案,这将关闭所有正在运行的 virtualbox vagrant boxes:
vagrant global-status | awk '/virtualbox running/{ print $1 }' | xargs vagrant halt