Bash 腳本等待 Virtualbox VM 關閉?

Bash 腳本等待 Virtualbox VM 關閉?

Virtualbox 能夠向正在執行的虛擬機器發出命令:

vboxmanage controlvm NameOfRunningVM acpipowerbutton

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

情況:我計劃在 /etc/init.d 腳本中使用它。這將允許正常關閉所有正在運行的虛擬機器。目前,當我發出vboxmanage controlvm NameOfRunningVM acpipowerbutton命令時,關閉會中斷,因為該命令不會等待虛擬機器關閉。

我需要一個 Bash 腳本,該腳本將 Virtualbox 電腦的名稱和超時(以秒為單位)作為輸入,然後等待虛擬機器返回「斷電」狀態或發生逾時?

我不確定執行此操作的最佳方法是什麼。


我正在考慮使用以下命令檢查虛擬機器的狀態:

[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 相同的想法,但透過將 poll 卸載到 watch 命令來減少麻煩:

$ 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關閉煩人的標頭;我們關閉了 watch 的 stdout,因為目的是阻塞,並且我們在 fork 中運行,而從技術上講,阻塞wait是可中斷的。

我將命令字串傳遞給time -p bash,以便我可以輕鬆附加time本演示的目的,但實際上,您可以這樣做:

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

免責聲明:這些都沒有經過真正的測試

相關內容