Chiusura di tutte le VM virtuali (vagabonde) con un unico comando bash facile da usare (che può essere inserito in un file bash)

65

Uso vagabondo per lo sviluppo. Ho dimenticato di spegnere alcune delle VM. Quando esco dal mio computer host, il processo di spegnimento di Ubuntu sembra sospeso.

Potrebbe esserci un modo per codificare una chiusura di tutte le scatole vagabonde con un po 'di comando-fu? Qualcosa come il seguente, ma qualcosa che, beh, funziona.

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;
    
posta Rick 29.04.2014 - 00:59

8 risposte

82

Per un controllo tramite script delle macchine Virtual Box possiamo utilizzare il VBoxManage comandi:

  • Elenca le macchine in esecuzione (restituisce nome e UUID):

    VBoxManage list runningvms
    
  • Interrompe l'esecuzione di macchine virtuali "ibernandole" (consigliato per evitare la perdita di dati)

    VBoxManage controlvm <name|uuid> savestate
    
  • Spegni VM in esecuzione (non consigliato perché potremmo perdere dati nel guest)

    VBoxManage controlvm <name|uuid> poweroff
    
  • Usa ACPI in un SO guest compatibile con ACPI (preferibile a poweroff per l'arresto regolare dei guest)

    VBoxManage controlvm <name|uuid> acpipowerbutton
    

Vedi anche: Come spegnere in sicurezza Sistema operativo guest in VirtualBox utilizzando la riga di comando

Aggiornamento da OP

In base a questa risposta corretta selezionata di seguito, ho aggiunto questo script di bash " $HOME/bin/stop-vagrant.sh ". Così ora ho qualcosa che può tranquillamente iniziare una fermata di tutte le macchine virtuali vagabonde che avrei potuto accendere ancora dimenticate in una sessione.

vboxmanage list runningvms | sed -r 's/.*\{(.*)\}//' | xargs -L1 -I {} VBoxManage controlvm {} savestate

Comando spiegato:

vboxmanage list runningvms | - ottiene un elenco di tutti i vms in esecuzione in VirtualBox

sed -r 's/.*\{(.*)\}//' | : rimuove la stringa in basso nel numero id

xargs -L1 -I {} VBoxManage controlvm {} savestate : esegue il comando salva stato su ogni casella aperta.

On xargs

  • -L1 : prendi una riga alla volta
  • -I {} - utilizza {} come segnaposto per il comando successivo
risposta data Takkat 29.04.2014 - 11:31
21

L'altra risposta è ottima per la gestione di Virtualbox, ma Vagrant dispone di meccanismi propri per la gestione di macchine virtuali e, come menzionato in uno dei commenti, supporta molto più che VirtualBox, solo VMWare al momento, ma chissà dopo !

Questo sembra funzionare per me:

vagrant global-status | awk '/running/{print }' | xargs -r -d '\n' -n 1 -- vagrant suspend

Nota:

Funziona con le versioni di Vagrant dopo la 1.6, per le versioni precedenti, dovresti probabilmente aggiornarlo, ma se non puoi, una delle altre opzioni che si concentra su Virtualbox potrebbe essere migliore.

    
risposta data ThomasRedstone 23.12.2014 - 15:35
9

Il mio meccanismo per questo:

vagrant global-status | grep virtualbox | cut -c 1-9 | while read line; do echo $line; vagrant halt $line; done;

  • lo stato globale elenca tutte le caselle
  • filtra che per le righe contenenti virtualbox (filtra il testo della guida, si interromperà se stai usando un altro fornitore)
  • Filtra questo per visualizzare solo i primi 9 caratteri (l'ID univoco globale)
  • Mentre possiamo ancora leggere una riga da quell'input, leggerla come la variabile $ line, quindi:
    • Stampa la riga $
    • esegui vagrant halt $line arrestando il vagabondo per quell'ID univoco globale

Questo è meglio del metodo Virtualbox di cui sopra, perché eseguirà anche qualsiasi meccanismo di spegnimento configurato in modo vago.

    
risposta data Aquarion 03.05.2015 - 09:21
5

Nel caso in cui altre persone arrivino a questa domanda: per chi usa VirtualBox, può già occuparsene, comporta solo la modifica di un file:

# Contents of /etc/default/virtualbox
# ...
# ...
# SHUTDOWN_USERS="foo bar"  
#   check for running VMs of user 'foo' and user 'bar'
#   'all' checks for all active users
# SHUTDOWN=poweroff
# SHUTDOWN=acpibutton
# SHUTDOWN=savestate
#   select one of these shutdown methods for running VMs
#   acpibutton and savestate causes the init script to wait
#   30 seconds for the VMs to shutdown

## My original values
# SHUTDOWN_USERS=""
# SHUTDOWN=poweroff

## My current values
SHUTDOWN_USERS="all"
SHUTDOWN=savestate

Il lato positivo è che non è necessario modificare / creare alcun logout o init.d stript per eseguire i comandi pubblicati nelle altre risposte. Lo svantaggio è che questa soluzione è specifica per VirtualBox.

Testato su Ubuntu 14.10 con VirtualBox 4.3.18.

Tutto il credito va a questo post .

    
risposta data Armando Pérez Marqués 11.04.2015 - 19:54
3

Combinando alcune delle altre risposte, questo chiuderà tutte le caselle vaganti di virtualbox in esecuzione:

vagrant global-status | awk '/virtualbox running/{ print  }' | xargs vagrant halt
    
risposta data Ryan 15.03.2016 - 15:51
2

Uso solo vagrant halt . Se lo esegui senza ulteriori argomenti, interrompe tutte le macchine definite in Vagrantfile .

    
risposta data nomen 15.03.2016 - 04:42
1

Se stai scrivendo script per analizzare i comandi di Vagrant, è consigliabile analizzare un output di tipo "machine-friendly" ( --machine-readable ) che è più coerente.

Il formato è:

timestamp,target,type,data...

quindi puoi importarlo come file CSV, poiché è separato da virgole.

Con la shell, è probabilmente più difficile da analizzare, ad esempio:

for id in $(vagrant global-status --machine-readable | cut -d, -f5 | grep -B3 running | egrep -o "[0-9a-f]{7}"); do
    vagrant suspend $id;
done

Vedi: Vagrant - Output leggibile dalla macchina

Tuttavia trovo più semplice analizzare l'output standard, ad es.

while read id name provider state path; do
  [ "$state" = "running" ] && vagrant suspend $id;
done < <(vagrant global-status)

Btw. In teoria, il comando vagrant dovrebbe accettare un'espressione regolare per l'elenco di VM da sospendere come da questo GH post , ad esempio:

vagrant suspend '*'

ma non funziona e c'è un bug # 7221 che è in sospeso per risolverlo .

Biglietti GitHub correlati:

risposta data kenorb 08.04.2016 - 22:14
0

Potrebbe funzionare o meno per te ;-) Funziona per me

vagrant_halt_all.sh

#!/usr/bin/env bash
if [ -z "" ]
then
  OPTS=""
else
  # force close if any arg passed
  OPTS="-f"
fi

for i in $(vagrant global-status | grep running | awk '{print }'); do 
  DIR=$(vagrant global-status | grep running | awk '{print }')
  cd "$DIR";
  OUT=$(vagrant halt);
  echo "attempted to halt $i: $OUT"
done
    
risposta data brad parks 11.04.2018 - 20:23

Leggi altre domande sui tag