Закрытие всего VirtualBox (бродячий) VMs в одной простой в использовании команде удара (который может быть помещен в файл удара),

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

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

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;
70
задан 30 April 2014 в 21:47

9 ответов

Для scriptable управления Виртуальных машин Поля мы можем использовать команды VBoxManage:

  • Беговые дорожки списка (возвращает имя и UUID):

    VBoxManage list runningvms
    
  • Прекратите выполнять VMs путем "спящего режима" их (reommended для предотвращения потери данных)

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

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

    VBoxManage controlvm <name|uuid> acpipowerbutton
    

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

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

На основе этого выбранного корректного ответа ниже, я добавил этот сценарий удара"$HOME/bin/stop-vagrant.sh". Таким образом, теперь у меня есть что-то, что может безопасно начать остановку всего бродячего VMs, о котором я, возможно, включил все же забытый на сессии.

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

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

vboxmanage list runningvms | - получает список всего выполнения vms под VirtualBox

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

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

На xargs

  • -L1 - проводите одну строку за один раз
  • -I {} - использование {} как заполнитель для следующей команды
91
ответ дан 16 November 2019 в 10:03

Другой ответ является большим для обработки Virtualbox, но функции Vagrant его собственные механизмы для обработки Виртуальных машин, и как был упомянут в одном из комментариев, это поддерживает больше, чем просто VirtualBox, просто VMware в данный момент, но кто знает позже!

Это, кажется, работает на меня:

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

Примечание:

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

23
ответ дан 16 November 2019 в 10:03

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

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

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

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

12
ответ дан 16 November 2019 в 10:03

В случае, если другие люди добираются до этого вопроса: Для тех, которые используют 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.

Весь кредит переходит в это сообщение .

5
ответ дан 16 November 2019 в 10:03

Комбинируя некоторые из других ответов, это закроет все выполнение virtualbox бродячие поля:

vagrant global-status | awk '/virtualbox running/{ print $1 }' | xargs vagrant halt
5
ответ дан 16 November 2019 в 10:03

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

3
ответ дан 16 November 2019 в 10:03

Если Вы пишете сценарии для парсинга Бродячих команд, рекомендуется проанализировать благоприятный для машины вывод (--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

См.: Бродяга - Машиночитаемый вывод

<час>

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

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

Btw. Команда Theoretically vagrant должна принять, что регулярное выражение для списка VMs приостанавливает согласно этому сообщению GH , например:

vagrant suspend '*'

, но это не работает и существует ошибка № 7221 , который находится на рассмотрении для фиксации его.

<час>

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

1
ответ дан 16 November 2019 в 10:03

Это может или не может работать на Вас ;-) Работы для меня

vagrant_halt_all.sh

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

for i in $(vagrant global-status | grep running | awk '{print $1}'); do 
  DIR=$(vagrant global-status | grep running | awk '{print $5}')
  cd "$DIR";
  OUT=$(vagrant halt);
  echo "attempted to halt $i: $OUT"
done
0
ответ дан 22 November 2019 в 23:28

Вот подборка рабочих однострочников по состоянию на сентябрь 2020 года. Спасибо всем предыдущим авторам за вдохновение.

Остановить все бродячие ящики

Версия 1 (более короткая)

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

Версия 2 (более надежная)

Совместимость с macOS/BSD:

vagrant global-status --machine-readable | cut -d, -f5 | grep -B3 running | egrep -o '[0-9a-f]{7}' | xargs -n 1 -- vagrant halt

Совместимость с GNU:

vagrant global-status --machine-readable | cut -d, -f5 | grep -B3 running | egrep -o '[0-9a-f]{7}' | xargs -r -d '\n' -n 1 -- vagrant halt

Псевдоним

Вы можете добавить это в псевдоним для быстрого выполнения. Добавьте этот код в ~/.bashrc, ~/.zshrc или эквивалент вашей оболочки.

Пример macOS/BSD:

alias vagrantHaltAll="vagrant global-status --machine-readable | cut -d, -f5 | grep -B3 running | egrep -o '[0-9a-f]{7}' | xargs -n 1 -- vagrant halt"

# Usage:
vagrantHaltAll

Приостановить все бродячие ящики

Или, если вы хотите приостановить любые работающие машины, синтаксис прост:

vagrant suspend --all

Я рекомендую использовать остановить для веб-серверов; это экономит место на диске и может быть быстрее.

0
ответ дан 18 September 2020 в 08:53

Другие вопросы по тегам:

Похожие вопросы: