Używam włóczęgi do rozwoju. Zapomniałem zamknąć kilka maszyn wirtualnych. Kiedy idę się wylogować z komputera hosta, proces zamykania systemu Ubuntu wydaje się zawiesić.
Czy może istnieć sposób na napisanie skryptu zamknięcia wszystkich włóczęgów z odrobiną linii poleceń? Coś takiego jak poniżej, ale coś, co, cóż, działa.
for f in $HOME/vagrant;
do;
cd $f
vagrant halt
done;
Odpowiedzi:
Do skryptowej kontroli maszyn Virtual Box możemy użyć poleceń VBoxManage :
Wyświetl listę uruchomionych maszyn (zwraca nazwę i identyfikator UUID):
Przestań uruchamiać maszyny wirtualne, „hibernując” je (zalecane, aby uniknąć utraty danych)
Wyłącz uruchamianie maszyn wirtualnych (niezalecane, ponieważ możemy utracić dane gościa)
Użyj ACPI w systemie operacyjnym gościa obsługującym ACPI (lepiej niż w
poweroff
przypadku płynnego zamykania gości)Zobacz także: Jak bezpiecznie zamknąć system operacyjny gościa w VirtualBox przy użyciu wiersza polecenia
Aktualizacja z OP
Na podstawie tej wybranej poprawnej odpowiedzi poniżej dodałem ten skrypt bash „
$HOME/bin/stop-vagrant.sh
”. Więc teraz mam coś, co może bezpiecznie rozpocząć zatrzymywanie wszystkich wirtualnych maszyn wirtualnych, o których mogłem włączyć, ale o których zapomniałem podczas sesji.Wyjaśnienie polecenia:
vboxmanage list runningvms |
- pobiera listę wszystkich uruchomionych vms pod VirtualBoxsed -r 's/.*\{(.*)\}/\1/' |
- usuwa ciąg znaków do numeru identyfikacyjnegoxargs -L1 -I {} VBoxManage controlvm {} savestate
- uruchamia polecenie zapisu stanu na każdym otwartym oknie.Na
xargs
-L1
- bierz jedną linię na raz-I {}
- używa {} jako symbol zastępczy dla następnego poleceniaźródło
-r
opcja jest unikalna dla GNU Sed.-E
zamiast-r
. To flaga używająca rozszerzonych wyrażeń regularnych.Druga odpowiedź jest świetna do obsługi Virtualbox, ale Vagrant posiada własne mechanizmy do obsługi maszyn wirtualnych i, jak wspomniano w jednym z komentarzy, obsługuje więcej niż tylko VirtualBox, tylko VMWare w tej chwili, ale kto wie później!
Wydaje mi się, że to działa:
Uwaga:
Działa to z wersjami Vagrant po 1.6, w przypadku starszych wersji prawdopodobnie powinieneś zaktualizować, ale jeśli nie możesz, jedna z innych opcji skupiających się na Virtualbox może być lepsza.
źródło
global-status
Rozkaz został wprowadzony w Vagrant 1,6 . Użytkownicy starszych wersji Vagrant, szczególnie ci, którzy zainstalowali go za pośrednictwemapt-get
i nadal mogą korzystać z 1.4.3, będą musieli zaktualizować swoją instalację Vagrant, zanim będą mogli używać tego polecenia.xargs
nie obsługuje-r
, dlatego możesz zainstalowaćgxargs
za pomocąbrew
i używać go zamiast tego.Mój mechanizm tego:
vagrant global-status | grep virtualbox | cut -c 1-9 | while read line; do echo $line; vagrant halt $line; done;
virtualbox
(Filtruje tekst pomocy, zepsuje się, jeśli używasz innego dostawcy)vagrant halt $line
zatrzymując włóczęgę dla tego globalnego unikalnego identyfikatoraJest to lepsze niż powyższa metoda Virtualbox, ponieważ uruchomi ona również wszelkie mechanizmy zamykania skonfigurowane przez włóczęgów.
źródło
sed
orazawk
. Dzięki!vagrant suspend
zamiastvagrant halt
zapisać stan i zawiesić, aby przyspieszyć w dół i w górę.W przypadku, gdy inne osoby przejdą do tego pytania: Osoby korzystające z VirtualBox już mogą się tym zająć, obejmują tylko edycję pliku:
Plusem jest to, że nie trzeba edytować / tworzyć żadnego wylogowania ani
init.d
striptizu, aby uruchomić polecenia zamieszczone w innych odpowiedziach. Minusem jest to, że to rozwiązanie jest specyficzne dla VirtualBox.Testowany na Ubuntu 14.10 z VirtualBox 4.3.18.
Wszystkie kredyty trafiają do tego postu .
źródło
Łącząc niektóre z pozostałych odpowiedzi, spowoduje to zamknięcie wszystkich działających wirtualnych skrzynek Vibrant:
źródło
Po prostu używam
vagrant halt
. Jeśli uruchomisz go bez dalszego argumentu, zatrzyma wszystkie maszyny zdefiniowane wVagrantfile
.źródło
Jeśli piszesz skrypty do analizowania komend Vagrant, zaleca się analizowanie danych wyjściowych przyjaznych dla maszyny (
--machine-readable
), co jest bardziej spójne.Format to:
dzięki czemu możesz zaimportować go jako plik CSV, ponieważ jest on oddzielony przecinkami.
W przypadku powłoki prawdopodobnie trudniej jest ją przeanalizować, na przykład:
Patrz: Vagrant - Dane wyjściowe do odczytu maszynowego
Jednak łatwiej mi parsować standardowe wyjście, np
Btw. Teoretycznie
vagrant
polecenie powinno zaakceptować wyrażenie regularne dla listy maszyn wirtualnych do zawieszenia zgodnie z tym postem GH , na przykład:ale to nie działa i jest błąd # 7221, który czeka na naprawę.
Powiązane bilety GitHub:
źródło
To może, ale nie musi, działać ;-) Działa dla mnie
vagrant_halt_all.sh
źródło