Arrêter toutes les machines virtuelles VirtualBox (vagabond) dans une commande bash facile à utiliser (qui peut être placée dans un fichier bash)

65

J'utilise vagabond pour le développement. J'ai oublié de fermer quelques VM. Lorsque je vais me déconnecter de ma machine hôte, le processus d'arrêt d'Ubuntu semble se bloquer.

Peut-il y avoir un moyen de créer un script de fermeture de toutes les boîtes avec un peu de ligne de commande-fu? Quelque chose comme ce qui suit, mais quelque chose qui fonctionne bien.

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;
    
posée Rick 29.04.2014 - 00:59
la source

8 réponses

82

Pour un contrôle scriptable des machines Virtual Box, nous pouvons utiliser le VBoxManage commandes:

  • Répertorie les machines en cours d'exécution (renvoie le nom et l'UUID):

    VBoxManage list runningvms
    
  • Arrêtez d’exécuter les machines virtuelles en les "hibernant" (recommandé pour éviter la perte de données)

    VBoxManage controlvm <name|uuid> savestate
    
  • Poweroffs exécutant des machines virtuelles (non recommandé car nous risquons de perdre des données dans l'invité)

    VBoxManage controlvm <name|uuid> poweroff
    
  • Utilisez ACPI dans un OS invité compatible ACPI (préférable à poweroff pour un arrêt en douceur des invités)

    VBoxManage controlvm <name|uuid> acpipowerbutton
    

Voir aussi: Comment arrêter en toute sécurité Guest OS dans VirtualBox en utilisant la ligne de commande

Mise à jour depuis l'OP

Sur la base de cette réponse correcte sélectionnée ci-dessous, j'ai ajouté ce script bash " $HOME/bin/stop-vagrant.sh ". Alors maintenant, j'ai quelque chose qui peut commencer en toute sécurité un arrêt de toutes les machines virtuelles vagabondes que j'aurais pu mettre en route, mais qui ont été oubliées dans une session.

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

Commande expliquée:

vboxmanage list runningvms | - obtient une liste de toutes les vms en cours d'exécution sous VirtualBox

sed -r 's/.*\{(.*)\}//' | - supprime la chaîne jusqu'au numéro d'identification

xargs -L1 -I {} VBoxManage controlvm {} savestate - exécute la commande save state sur chaque boîte ouverte.

Sur xargs

  • -L1 - prenez une ligne à la fois
  • -I {} - utilise {} comme espace réservé pour la prochaine commande
réponse donnée Takkat 29.04.2014 - 11:31
la source
21

L'autre réponse est excellente pour gérer Virtualbox, mais Vagrant dispose de ses propres mécanismes pour gérer les machines virtuelles, et comme mentionné dans l'un des commentaires, il supporte plus que VirtualBox, juste VMWare pour le moment, mais qui sait plus tard !

Cela semble fonctionner pour moi:

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

Remarque:

Cela fonctionne avec les versions de Vagrant après la version 1.6, pour les anciennes versions, vous devriez probablement mettre à jour, mais si vous ne pouvez pas, l'une des autres options qui se concentre sur Virtualbox peut être meilleure.

    
réponse donnée ThomasRedstone 23.12.2014 - 15:35
la source
9

Mon mécanisme pour cela:

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

  • état global liste toutes les cases
  • filtre que pour les lignes contenant virtualbox (Filtre le texte d'aide, va se casser si vous utilisez un autre fournisseur)
  • Filtrez cela pour afficher uniquement les 9 premiers caractères (l'ID unique global)
  • Bien que nous puissions toujours lire une ligne à partir de cette entrée, lisez-la comme variable $ line puis:
    • Imprimez cette ligne $
    • exécute vagrant halt $line en arrêtant le vagabond pour cet identifiant unique global

Cela vaut mieux que la méthode Virtualbox ci-dessus, car elle exécutera également tous les mécanismes d’arrêt configurés par des vagabonds.

    
réponse donnée Aquarion 03.05.2015 - 09:21
la source
5

Au cas où d'autres personnes arriveraient à cette question: Pour ceux qui utilisent VirtualBox, cela peut déjà être fait, il suffit d'éditer un fichier:

# 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

L'avantage est qu'il n'est pas nécessaire de modifier / créer une déconnexion ou que init.d stript exécute les commandes publiées dans les autres réponses. L'inconvénient est que cette solution est spécifique à VirtualBox.

Testé sur Ubuntu 14.10 avec VirtualBox 4.3.18.

Tout le crédit va à cet article .

    
réponse donnée Armando Pérez Marqués 11.04.2015 - 19:54
la source
3

En combinant certaines des autres réponses, cela fermera toutes les boîtes virtuelles de la boîte virtuelle:

vagrant global-status | awk '/virtualbox running/{ print  }' | xargs vagrant halt
    
réponse donnée Ryan 15.03.2016 - 15:51
la source
2

J'utilise juste vagrant halt . Si vous l'exécutez sans autre argument, il arrête toutes les machines définies dans Vagrantfile .

    
réponse donnée nomen 15.03.2016 - 04:42
la source
1

Si vous écrivez des scripts pour analyser les commandes Vagrant, il est conseillé d’analyser une sortie plus conviviale ( --machine-readable ) qui est plus cohérente.

Le format est le suivant:

timestamp,target,type,data...

vous pouvez donc l’importer en tant que fichier CSV, car il est séparé par des virgules.

Avec shell, il est probablement plus difficile à analyser, par exemple:

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

Voir: Vagrant - Sortie lisible par machine

Cependant, je trouve plus facile d’analyser la sortie standard, par exemple

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

Btw. Théoriquement, la commande vagrant doit accepter une expression régulière pour la liste des machines virtuelles à suspendre conformément à cette publication , par exemple:

vagrant suspend '*'

mais cela ne fonctionne pas et il y a un bogue # 7221 qui est en attente afin de le corriger .

Billets GitHub associés:

réponse donnée kenorb 08.04.2016 - 22:14
la source
0

Cela peut ou peut ne pas fonctionner pour vous ;-) Fonctionne pour moi

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
    
réponse donnée brad parks 11.04.2018 - 20:23
la source

Lire d'autres questions sur les étiquettes