Bash 脚本等待 Virtualbox VM 关闭?

Bash 脚本等待 Virtualbox VM 关闭?

Virtualbox 能够向正在运行的虚拟机发出命令:

vboxmanage controlvm NameOfRunningVM acpipowerbutton

但是此命令立即返回,导致我的情况非正常关机。

情况:我计划在 /etc/init.d 脚本中使用它。这将允许正常关闭所有正在运行的虚拟机。目前,当我发出命令时,vboxmanage controlvm NameOfRunningVM acpipowerbutton关闭会被切断,因为该命令不会等待虚拟机关闭。

我需要一个 Bash 脚本,将 Virtualbox 机器的名称和秒数的超时作为输入,然后等待 VM 返回“关机”状态或发生超时?

我不确定完成这件事的最佳方法是什么。


我正在考虑使用以下命令检查虚拟机的状态:

[user@machine ~]$ vboxmanage list runningvms
"VirtualMachineName" {65c93f1f-4508-4119-b07d-ce9e89b23b8e}

bash 脚本可能会轮询正在运行的虚拟机列表。一旦机器名称不再列出,虚拟机将被视为已完成。

答案1

使用轮询,可以像这样完成:

#!/bin/bash
MACHINE=$1
echo "Waiting for machine $MACHINE to poweroff..."

until $(VBoxManage showvminfo --machinereadable $MACHINE | grep -q ^VMState=.poweroff.)
do
  sleep 1
done

答案2

与@larstobi 的想法相同,但是通过将轮询卸载到监视命令可以减少麻烦:

$ vboxmanage list vms
"guest" {fubar-rabuf-bufu}
$ vboxmanage showvminfo guest | grep -i state
State:           running (since 2020-08-05T02:37:13.784000000)
$ printf '( watch -te  -- "! vboxmanage showvminfo guest | grep -i poweroff" >&- & wait )' | time -p bash
Command terminated by signal 2
real 5.05
user 0.00
sys 0.00

-e标志会导致在命令结果为非零时退出,同时-t关闭烦人的标题;我们关闭 stdout 进行监视,因为目的是阻止并且我们在 fork 中运行,而从技术上讲,阻止wait是可中断的。

我将命令字符串传递给time -p bash,以便我可以轻松地附加time到此演示的目的,但实际上,您只需执行以下操作即可:

$ ( watch -te  -- "! expression" >&- & wait )

免责声明:这些均未经过真正测试

相关内容