使用一个易于使用的 bash 命令(可以放入 bash 文件中)关闭所有 VirtualBox(vagrant)虚拟机

使用一个易于使用的 bash 命令(可以放入 bash 文件中)关闭所有 VirtualBox(vagrant)虚拟机

我用流浪汉用于开发。我忘记关闭几个虚拟机。当我退出主机时,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

相关内容