Bash-скрипт для ожидания завершения работы Virtualbox VM?

7480
Trevor Boyd Smith

Virtualbox имеет возможность выдать команду работающему vm:

vboxmanage controlvm NameOfRunningVM acpipowerbutton 

Однако эта команда немедленно возвращается, что приводит к неосторожному отключению в моей ситуации.

Ситуация: я планирую использовать это в скрипте /etc/init.d. Это позволило бы корректно завершить работу всех работающих виртуальных машин. В настоящее время, когда я запускаю vboxmanage controlvm NameOfRunningVM acpipowerbuttonкоманду, выключение завершается, потому что команда не ожидает выключения виртуальной машины.

Мне нужен сценарий Bash, который принимает в качестве входных данных имя компьютера Virtualbox и время ожидания в секундах, а затем ожидает, когда виртуальная машина вернется в состояние «выключения», или время ожидания истекло?

Я не уверен, что это лучший способ сделать это.


Я думал о проверке состояния виртуальной машины с помощью следующей команды:

[user@machine ~]$ vboxmanage list runningvms "VirtualMachineName"  

Сценарий bash, возможно, будет опрашивать список работающих виртуальных машин. Как только имя машины перестанет быть в списке, виртуальная машина будет считаться завершенной.

6
Я не уверен, что понимаю. Если команда вернется немедленно, чего будет ждать скрипт BASH? terdon 11 лет назад 0
Не могли бы вы "пропинговать" виртуальную машину (-ы) и подождать, пока она не выйдет из строя, прежде чем позволить хосту выключиться? (Возможно, вы захотите подождать несколько секунд после сбоя ping для полной остановки виртуальной машины.) Или есть какая-то команда, специфичная для Virtualbox, которая позволяет вам запрашивать состояние виртуальной машины? Scott 11 лет назад 0
Опрос, вероятно, лучшее, что вы можете сделать. Проблема в том, что команда, которую вы запускаете, имитирует нажатие кнопки питания на машине. Разные ОС по-разному обрабатывают это действие. Ubuntu Desktop, например, дает вам диалоговое окно с вопросом, что вы хотели бы сделать. Другие не справляются с этим вообще, поэтому VirtualBox не может знать, действительно ли система закрывается. Другие параметры отключения питания (PowerOff или SaveState) полностью контролируются VirtualBox и будут ждать завершения действия. heavyd 11 лет назад 0

1 ответ на вопрос

12
larstobi

Используя опрос, это можно сделать так:

#!/bin/bash MACHINE=$1 echo "Waiting for machine $MACHINE to poweroff..."  until $(VBoxManage showvminfo --machinereadable $MACHINE | grep -q ^VMState=.poweroff.) do sleep 1 done 

Похожие вопросы