Выключение всех виртуальных машин VirtualBox (vagrant) в одной простой команде bash (которую можно поместить в файл bash)

63

Я использую бродягу для разработки. Я забыл закрыть несколько виртуальных машин. Когда я иду, чтобы выйти из моей главной машины, процесс завершения Ubuntu, похоже, зависает.

Может ли быть способ сценария закрытия всех бродячих боксов с немного командной строки-фу? Что-то вроде следующего, но что-то, что, ну, работает.

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;
    
задан Richard 29.04.2014 в 00:59
источник

7 ответов

81

Для скриптового управления машинами Virtual Box мы можем использовать VBoxManage команды:

  • Список работающих машин (имя и UUID):

    VBoxManage list runningvms
    
  • Остановить запуск виртуальных машин путем "спячки" (рекомендуется для предотвращения потери данных)

    VBoxManage controlvm <name|uuid> savestate
    
  • Включение виртуальных машин с отключением питания (не рекомендуется, поскольку мы можем потерять данные в гостевой системе)

    VBoxManage controlvm <name|uuid> poweroff
    
  • Используйте ACPI в гостевой ОС, поддерживающей ACPI (предпочтительнее poweroff для изящного закрытия гостей)

    VBoxManage controlvm <name|uuid> acpipowerbutton
    

Также см .: Как безопасное завершение работы Гостевая ОС в VirtualBox с помощью командной строки

Обновление от OP

Основываясь на этом выбранном правильном ответе ниже, я добавил этот сценарий bash " $HOME/bin/stop-vagrant.sh ". Итак, теперь у меня есть что-то, что может безопасно начать остановку всех бродячих ВМ, которые я, возможно, включил, но забыл в сеансе.

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

Объяснение команды:

vboxmanage list runningvms | - получает список всех запущенных vms в VirtualBox

sed -r 's/.*\{(.*)\}//' | - разбивает строку до номера id

xargs -L1 -I {} VBoxManage controlvm {} savestate - запускает команду сохранения состояния для каждого открытого окна.

Вкл. xargs

  • -L1 - принимать по одной строке за раз
  • -I {} - использует {} в качестве владельца места для следующей команды
ответ дан Takkat 29.04.2014 в 11:31
источник
18

Другой ответ отлично подходит для обработки Virtualbox, но у Vagrant есть свои собственные механизмы для работы с Virtual Machines, и, как упоминалось в одном из комментариев, он поддерживает больше, чем просто VirtualBox, просто VMWare на данный момент, но кто знает позже

Кажется, это работает для меня:

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

Примечание:

Это работает с версиями Vagrant после версии 1.6, для более старых версий вы, вероятно, должны обновиться, но если вы не можете, одна из других опций, которые фокусируются на Virtualbox, может быть лучше.

    
ответ дан ThomasRedstone 23.12.2014 в 15:35
9

Мой механизм для этого:

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

  • global-status отображает все поля
  • фильтр, который для строк, содержащих virtualbox (удаляет текст справки, будет ломаться, если вы используете какой-либо другой провайдер)
  • Отфильтруйте, чтобы отображать только первые 9 символов (глобальный уникальный идентификатор)
  • Пока мы все еще читаем строку с этого ввода, читаем ее как переменную $ line:
    • Распечатайте, что $ line
    • запустите vagrant halt $line , остановив бродягу для этого глобального уникального идентификатора

Это лучше, чем приведенный выше метод Virtualbox, потому что он также запускает любые механизмы отключения с помощью бродяг.

    
ответ дан Aquarion 03.05.2015 в 09:21
4

В случае, если другие люди доберутся до этого вопроса: для тех, кто использует VirtualBox, он уже может позаботиться об этом, только включает в себя редактирование файла:

# 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

Потенциал - это то, что нет необходимости редактировать / создавать какой-либо выход из системы или init.d stript для запуска команд, размещенных в других ответах. Недостатком является то, что это решение относится к VirtualBox.

Протестировано на Ubuntu 14.10 с помощью VirtualBox 4.3.18.

Все кредиты передаются этому сообщению .

    
ответ дан Armando Pérez Marqués 11.04.2015 в 19:54
3

Объединяя некоторые другие ответы, это закроет все запущенные виртуальные боксы:

vagrant global-status | awk '/virtualbox running/{ print  }' | xargs vagrant halt
    
ответ дан Ryan 15.03.2016 в 15:51
2

Я просто использую vagrant halt . Если вы запустите его без дополнительного аргумента, он остановит все машины, определенные в файле Vagrantfile .

    
ответ дан nomen 15.03.2016 в 04:42
1

Если вы пишете скрипты для разбора команд Vagrant, рекомендуется разбирать машинный вывод ( --machine-readable ), который более согласован.

Формат:

timestamp,target,type,data...

, чтобы вы могли импортировать его как CSV-файл, так как он разделен запятыми.

С оболочкой, вероятно, сложнее разобрать, например:

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

Смотрите: Vagrant - Машиночитаемый вывод

Однако мне легче анализировать стандартный вывод, например

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

Btw. Теоретически команда vagrant должна принимать регулярное выражение для того, чтобы список виртуальных машин был приостановлен в соответствии с этим GH пост , например:

vagrant suspend '*'

, но он не работает, и есть ошибка # 7221 , которая находится на рассмотрении, чтобы исправить ошибку .

Связанные билеты GitHub:

ответ дан kenorb 08.04.2016 в 22:14