75 votes

Fermeture de toutes les VM de VirtualBox (vagrant) en une seule commande bash facile à utiliser (qui peut être placée dans un fichier bash)

J'utilise vagabondage pour le développement. J'oublie d'éteindre quelques-unes des VM. Lorsque je veux me déconnecter de ma machine hôte, le processus d'arrêt d'Ubuntu semble se bloquer.

Y aurait-il un moyen de script une fermeture de toutes les boîtes vagrant avec un peu de ligne de commande-fu ? Quelque chose comme ce qui suit, mais quelque chose qui, eh bien, fonctionne.

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;

100voto

Takkat Points 135194

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

  • Liste des machines en cours d'exécution (renvoie le nom et l'UUID) :

    VBoxManage list runningvms
  • Arrêtez les VMs en cours d'exécution en les "hibernant" (recommandé pour éviter la perte de données).

    VBoxManage controlvm <name|uuid> savestate
  • Eteindre les VMs en cours d'exécution (non recommandé car nous pouvons perdre des données dans l'invité)

    VBoxManage controlvm <name|uuid> poweroff
  • Utilisez l'ACPI dans un système d'exploitation invité conscient de l'ACPI (préférable à l'ACPI). poweroff pour la fermeture gracieuse des invités)

    VBoxManage controlvm <name|uuid> acpipowerbutton

Voir aussi : Comment arrêter en toute sécurité le système d'exploitation invité dans VirtualBox à l'aide de la ligne de commande ?

Mise à jour de l'OP

Sur la base de la réponse correcte sélectionnée ci-dessous, j'ai ajouté ce bash script " $HOME/bin/stop-vagrant.sh ". Donc maintenant, j'ai quelque chose qui peut commencer en toute sécurité un arrêt de tous les vagabonds.

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

La commande expliquée :

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

sed -r 's/.*\{(.*)\}/\1/' | -- réduit la chaîne à un numéro d'identification

xargs -L1 -I {} VBoxManage controlvm {} savestate -- exécute la commande de sauvegarde d'état sur chaque boîte ouverte.

Sur xargs

  • -L1 - prendre une ligne à la fois
  • -I {} - utilise {} comme place holder pour la prochaine commande

26voto

ThomasRedstone Points 361

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 il a été 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 $1}' | xargs -r -d '\n' -n 1 -- vagrant suspend

Note :

Cela fonctionne avec les versions de Vagrant postérieures à la version 1.6. Pour les versions plus anciennes, vous devriez probablement effectuer une mise à niveau, mais si vous ne pouvez pas, l'une des autres options qui se concentrent sur Virtualbox peut être meilleure.

12voto

Rob Rolnick Points 4075

Mon mécanisme pour cela :

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

  • global-status liste toutes les boîtes
  • filtre que pour les lignes contenant virtualbox (Filtre le texte d'aide, sera cassé si vous utilisez un autre fournisseur)
  • Filtrez cette information pour n'afficher que les 9 premiers caractères (l'identifiant unique global).
  • Bien que nous puissions toujours lire une ligne depuis cette entrée, nous la lirons alors comme la variable $line :
    • Imprimez cette $line
    • exécuter vagrant halt $line arrêt du vagrant pour cet identifiant unique global

Cette méthode est meilleure que celle de Virtualbox ci-dessus, car elle exécutera également tous les mécanismes d'arrêt configurés par vagrant.

6voto

Ryan Points 201

En combinant certaines des autres réponses, cela fermera toutes les boîtes vagrant virtualbox en cours d'exécution :

vagrant global-status | awk '/virtualbox running/{ print $1 }' | xargs vagrant halt

5voto

Angus Points 104

Au cas où d'autres personnes se posent cette question : Pour ceux qui utilisent VirtualBox, il peut déjà s'occuper de cela, cela implique seulement de modifier 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 d'éditer/créer une déconnexion ou une déconnexion. init.d stript pour exécuter les commandes postées dans les autres réponses. L'inconvénient est que cette solution est spécifique à VirtualBox.

Testé sur Ubuntu 14.1

Tout le mérite revient à ce poste .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X