Bash-Skript zum Warten auf das Herunterfahren der Virtualbox-VM?

7544
Trevor Boyd Smith

Virtualbox kann einen Befehl an eine laufende VM ausgeben:

vboxmanage controlvm NameOfRunningVM acpipowerbutton 

Dieser Befehl wird jedoch sofort zurückgegeben, was zu einem nicht ordnungsgemäßen Herunterfahren meiner Situation führt.

Die Situation: Ich habe vor, dies in einem Skript /etc/init.d zu verwenden. Dies würde ein ordnungsgemäßes Herunterfahren aller laufenden VMs ermöglichen. Wenn ich den vboxmanage controlvm NameOfRunningVM acpipowerbuttonBefehl ausstelle, wird das Herunterfahren derzeit unterbrochen, da der Befehl nicht auf das Herunterfahren der VM wartet.

Ich brauche ein Bash-Skript, das den Namen der Virtualbox-Maschine als Eingabe akzeptiert und ein Timeout in Sekunden wartet, bis die VM in den Zustand "Poweroff" zurückkehrt oder das Timeout auftritt.

Ich bin mir nicht sicher, was der beste Weg ist, dies zu tun.


Ich dachte daran, den Status der VM mit dem folgenden Befehl zu überprüfen:

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

Das Bash-Skript würde möglicherweise eine Liste der laufenden VMs abfragen. Sobald der Computername nicht mehr aufgeführt ist, wird die VM als abgeschlossen betrachtet.

6
Ich bin mir nicht sicher ob ich das verstehe. Wenn der Befehl sofort zurückgegeben wird, worauf würde das BASH-Skript warten? terdon vor 11 Jahren 0
Könnten Sie die VMs pingen und warten, bis dies fehlschlägt, bevor der Host herunterfahren kann? (Möglicherweise möchten Sie nach dem Ping-Fehler einige Sekunden warten, bis die VM vollständig heruntergefahren ist.) Oder gibt es einen für Virtualbox spezifischen Befehl, mit dem Sie den Status einer VM abfragen können? Scott vor 11 Jahren 0
Umfragen sind wahrscheinlich das Beste, was Sie tun können. Das Problem ist, dass der Befehl, den Sie ausführen, simuliert wird, indem Sie den Netzschalter an der Maschine drücken. Verschiedene Betriebssysteme behandeln diese Aktion unterschiedlich. Ubuntu Desktop gibt Ihnen beispielsweise ein Dialogfeld, in dem Sie gefragt werden, was Sie tun möchten. Andere machen das überhaupt nicht aus, so dass VirtualBox nicht wissen kann, ob das System tatsächlich heruntergefahren wird. Die anderen Ausschaltoptionen (PowerOff oder SaveState) werden vollständig von VirtualBox gesteuert und warten, bis die Aktion abgeschlossen ist. heavyd vor 11 Jahren 0

1 Antwort auf die Frage

12
larstobi

Mit Hilfe von Polling könnte dies folgendermaßen erfolgen:

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