Usando o polling, isso pode ser feito assim:
#!/bin/bash
MACHINE=$1
echo "Waiting for machine $MACHINE to poweroff..."
until $(VBoxManage showvminfo --machinereadable $MACHINE | grep -q ^VMState=.poweroff.)
do
sleep 1
done
O Virtualbox tem a capacidade de emitir um comando para uma VM em execução:
vboxmanage controlvm NameOfRunningVM acpipowerbutton
No entanto, este comando retorna imediatamente, o que resulta em desligamento não-gracioso para minha situação.
A situação: Eu planejo usar isso em um script /etc/init.d. Isso permitiria o desligamento normal de todas as VMs em execução. Atualmente, quando emito o comando vboxmanage controlvm NameOfRunningVM acpipowerbutton
, o desligamento é interrompido porque o comando não espera que a VM seja desligada.
Eu preciso de um script Bash que tome como entrada o nome da máquina Virtualbox e um tempo limite em segundos, em seguida, aguarda a VM retornar ao estado "poweroff" ou o tempo limite ocorre?
Não sei qual é a melhor maneira de fazer isso.
Eu estava pensando em verificar o estado da VM com o seguinte comando:
[user@machine ~]$ vboxmanage list runningvms
"VirtualMachineName" {65c93f1f-4508-4119-b07d-ce9e89b23b8e}
O script bash talvez estivesse pesquisando uma lista de VMs em execução. Quando o nome da máquina deixar de ser listado, a VM será considerada concluída.
Usando o polling, isso pode ser feito assim:
#!/bin/bash
MACHINE=$1
echo "Waiting for machine $MACHINE to poweroff..."
until $(VBoxManage showvminfo --machinereadable $MACHINE | grep -q ^VMState=.poweroff.)
do
sleep 1
done