題 Bash腳本等待Virtualbox VM關閉?


Virtualbox能夠向正在運行的vm發出命令:

vboxmanage controlvm NameOfRunningVM acpipowerbutton

但是,此命令會立即返回,這會導致我的情況非正常關閉。

情況:我計劃在/etc/init.d腳本中使用它。這將允許正常關閉所有正在運行的VM。目前我發的時候 vboxmanage controlvm NameOfRunningVM acpipowerbutton 命令關閉被截止,因為該命令不等待VM關閉。

我需要一個Bash腳本,它將Virtualbox機器的名稱作為輸入,以秒為單位的超時,然後等待VM返回“poweroff”狀態或發生超時? 

我不確定這樣做的最佳方法是什麼。


我正在考慮使用以下命令檢查VM的狀態:

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

bash腳本可能會輪詢正在運行的VM列表。一旦機器名稱停止列出,VM將被視為已完成。


6
2018-02-07 15:48


起源


我不確定我理解。如果命令立即返回,BASH腳本將等待什麼? - terdon
您可以...嗎 ping 在允許主機關閉之前,VM等待它失敗? (您可能希望在幾秒鐘後允許 ping VM無法完全關閉。)或者是否有一些特定於Virtualbox的命令可以讓您查詢VM的狀態? - Scott
輪詢可能是你能做的最好的。問題是您正在運行的命令是模擬按下機器上的電源按鈕。不同的OS以不同的方式處理此操作。例如,Ubuntu Desktop會為您提供一個對話框,詢問您想要做什麼。其他人根本不處理它,因此VirtualBox無法知道系統是否實際關閉。其他斷電選項(PowerOff或SaveState)完全由VirtualBox控制,並將等待操作完成。 - heavyd


答案:


使用輪詢,可以這樣做:

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

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

12
2018-02-12 11:50