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

Ric*_*ick 73 command-line virtualbox vagrant

我使用vagrant进行开发。我忘记关闭一些虚拟机。当我退出主机时,Ubuntu 关闭过程似乎挂起。

有没有办法用一点命令行功能来编写关闭所有流浪盒子的脚本?类似下面的东西,但有些东西,嗯,有效。

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;
Run Code Online (Sandbox Code Playgroud)

Tak*_*kat 99

对于 Virtual Box 机器的脚本化控制,我们可以使用VBoxManage命令:

另请参阅:如何使用命令行安全地关闭 VirtualBox 中的客户机操作系统

从 OP 更新

基于下面这个选择的正确答案,我添加了这个 bash 脚本“ $HOME/bin/stop-vagrant.sh”。所以现在我有一些东西可以安全地开始停止所有我可能已经打开但在会话中忘记的流浪虚拟机。

vboxmanage list runningvms | sed -r 's/.*\{(.*)\}/\1/' | xargs -L1 -I {} VBoxManage controlvm {} savestate
Run Code Online (Sandbox Code Playgroud)

命令解释:

vboxmanage list runningvms | -- 获取 VirtualBox 下所有正在运行的虚拟机列表

sed -r 's/.*\{(.*)\}/\1/' | -- 将字符串剥离为 id 号

xargs -L1 -I {} VBoxManage controlvm {} savestate -- 在每个打开的盒子上运行保存状态命令。

xargs

  • -L1 - 一次走一条线
  • -I {} - 使用 {} 作为下一个命令的占位符


Tho*_*one 25

另一个答案非常适合处理 Virtualbox,但 Vagrant 具有自己的处理虚拟机的机制,正如其中一条评论中提到的,它支持的不仅仅是 VirtualBox,目前只支持 VMWare,但谁知道呢!

这似乎对我有用:

vagrant global-status | awk '/running/{print $1}' | xargs -r -d '\n' -n 1 -- vagrant suspend
Run Code Online (Sandbox Code Playgroud)

笔记:

这适用于 1.6 之后的 Vagrant 版本,对于旧版本,您可能应该升级,但如果不能,则专注于 Virtualbox 的其他选项之一可能会更好。

  • 这显然是一个更正确的(tm)答案。@Richard 应该考虑接受这个 (5认同)

Aqu*_*ion 12

我的机制:

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停止该全局唯一 ID 的流浪者

这比上面的 Virtualbox 方法要好,因为它也会运行任何 vagrant 配置的关闭机制。

  • 此命令也适用于 OS X 主机。其他的失败是由于 OSX 和 Linux 版本的 `sed` 和 `awk` 之间的命令行参数处理不同。谢谢! (3认同)
  • 上面的命令试图停止所有的盒子,不管有没有运行,因此需要很长时间来执行。对我来说,因为我只使用 virtualbox,所以我将“virtualbox”grep 更改为“running”,以仅获取正在运行的 grep。 (2认同)

小智 6

结合其他一些答案,这将关闭所有正在运行的 virtualbox vagrant box:

vagrant global-status | awk '/virtualbox running/{ print $1 }' | xargs vagrant halt
Run Code Online (Sandbox Code Playgroud)


Arm*_*ués 5

如果其他人遇到这个问题:对于那些使用 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
Run Code Online (Sandbox Code Playgroud)

好处是不需要编辑/创建任何注销或init.d剥离来运行其他答案中发布的命令。缺点是此解决方案特定于 VirtualBox。

在 Ubuntu 14.10 和 VirtualBox 4.3.18 上测试。

所有功劳都归功于这篇文章