Ich benutze Vagrant für die Entwicklung. Ich habe vergessen, einige der VMs herunterzufahren. Wenn ich mich von meinem Host-Computer abmelden möchte, scheint der Ubuntu-Shutdown-Prozess zu hängen.
Könnte es eine Möglichkeit geben, das Schließen aller Vagrant-Boxen mit ein bisschen Kommandozeilen-Fu zu skripten? Etwas wie das Folgende, aber etwas, das gut funktioniert.
for f in $HOME/vagrant;
do;
cd $f
vagrant halt
done;
Antworten:
Für eine skriptfähige Steuerung von Virtual Box-Maschinen können wir die VBoxManage- Befehle verwenden:
Laufende Maschinen auflisten (Name und UUID zurückgeben):
Beenden Sie die Ausführung von VMs durch "Ruhezustand" (empfohlen, um Datenverlust zu vermeiden)
Ausschalten von VMs (nicht empfohlen, da möglicherweise Daten im Gast verloren gehen)
Verwenden Sie ACPI in einem ACPI-fähigen Gastbetriebssystem (vorzuziehen
poweroff
für ein ordnungsgemäßes Herunterfahren von Gästen).Siehe auch: So fahren Sie das Gastbetriebssystem in VirtualBox über die Befehlszeile sicher herunter
Update von OP
Basierend auf der unten ausgewählten richtigen Antwort habe ich dieses Bash-Skript "
$HOME/bin/stop-vagrant.sh
" hinzugefügt . Jetzt habe ich also etwas, mit dem ich sicher anfangen kann, alle vagabundierenden VMs zu stoppen, die ich möglicherweise in einer Sitzung eingeschaltet und doch vergessen habe.Befehl erklärt:
vboxmanage list runningvms |
- Ruft eine Liste aller laufenden VMs unter VirtualBox absed -r 's/.*\{(.*)\}/\1/' |
- streift die Zeichenfolge bis zur ID-Nummer abxargs -L1 -I {} VBoxManage controlvm {} savestate
- Führt den Befehl zum Speichern des Status für jede Box aus, die geöffnet ist.Auf
xargs
-L1
- Nehmen Sie jeweils eine Zeile-I {}
- verwendet {} als Platzhalter für den nächsten Befehlquelle
-r
Option nur bei GNU Sed verfügbar ist.-E
anstelle von verwenden-r
. Es ist das Flag für die Verwendung von erweiterten regulären Ausdrücken.Die andere Antwort ist großartig für den Umgang mit Virtualbox, aber Vagrant verfügt über eigene Mechanismen für den Umgang mit virtuellen Maschinen und unterstützt, wie in einem der Kommentare erwähnt, mehr als nur VirtualBox, im Moment nur VMWare, aber wer weiß es später!
Das scheint bei mir zu funktionieren:
Hinweis:
Dies funktioniert mit Vagrant-Versionen nach 1.6. Für ältere Versionen sollten Sie wahrscheinlich ein Upgrade durchführen. Wenn dies jedoch nicht möglich ist, ist eine der anderen Optionen, die sich auf Virtualbox konzentrieren, möglicherweise besser.
quelle
global-status
Befehl wurde in Vagrant 1.6 eingeführt . Benutzer älterer Versionen von Vagrant, insbesondere diejenigen, die Vagrantapt-get
über 1.4.3 installiert haben und möglicherweise noch auf 1.4.3 installiert sind, müssen ihre Vagrant-Installation aktualisieren, bevor sie diesen Befehl verwenden können.xargs
unterstützt nicht-r
, daher können Sie esgxargs
über installierenbrew
und stattdessen verwenden.Mein Mechanismus dafür:
vagrant global-status | grep virtualbox | cut -c 1-9 | while read line; do echo $line; vagrant halt $line; done;
virtualbox
(Filtert den Hilfetext heraus, wird unterbrochen, wenn Sie einen anderen Anbieter verwenden)vagrant halt $line
die vagabundierenden für die globale eindeutige ID zu stoppenDies ist besser als die oben beschriebene Virtualbox-Methode, da dort auch alle vagrant konfigurierten Abschaltmechanismen ausgeführt werden.
quelle
sed
und fehlawk
. Vielen Dank!vagrant suspend
statt ,vagrant halt
um den Zustand zu speichern und für eine schnellere nach oben und unten suspendieren.Falls andere Leute auf diese Frage kommen: Für diejenigen, die VirtualBox verwenden, kann dies bereits erledigt werden, es muss lediglich eine Datei bearbeitet werden:
Der Vorteil ist, dass es nicht erforderlich ist, sich
init.d
abzumelden oder zu streifen, um die in den anderen Antworten angegebenen Befehle auszuführen. Der Nachteil ist, dass diese Lösung spezifisch für VirtualBox ist.Getestet unter Ubuntu 14.10 mit VirtualBox 4.3.18.
Alle Kredite gehen an diesen Beitrag .
quelle
Wenn Sie einige der anderen Antworten kombinieren, werden alle laufenden Vagabund-Boxen von virtualbox geschlossen:
quelle
Ich benutze nur
vagrant halt
. Wenn Sie es ohne weiteres Argument ausführen, werden alle in der definierten Rechner gestopptVagrantfile
.quelle
Wenn Sie Skripte schreiben, um Vagrant-Befehle zu analysieren, wird empfohlen, die maschinenfreundliche Ausgabe (
--machine-readable
) zu analysieren, die konsistenter ist.Das Format ist:
Sie können es also als CSV-Datei importieren, da es durch Kommas getrennt ist.
Mit der Shell ist das Parsen wahrscheinlich schwieriger, zum Beispiel:
Siehe: Vagrant - Maschinenlesbare Ausgabe
Ich finde es jedoch einfacher, die Standardausgabe zu analysieren, z
Btw. Theoretisch
vagrant
sollte der Befehl einen regulären Ausdruck für die Liste der VMs akzeptieren, die gemäß diesem GH- Post angehalten werden sollen. Beispiel:Aber es funktioniert nicht und es gibt einen Fehler # 7221, der noch aussteht, um ihn zu beheben.
Ähnliche GitHub Tickets:
quelle
Das kann bei dir funktionieren oder auch nicht ;-) Funktioniert bei mir
vagrant_halt_all.sh
quelle