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

Я нашел решение для редактора отвлечения.

Выбрав фокусник, я начал искать Google для подобных приложений и наткнулся на Мараве. Это не работает отлично, так как мне нужно запустить его с помощью sudo, чтобы сохранить его, но он полноэкранный и отвлекающий, спасибо за вход

1
задан 30 April 2014 в 22:47

7 ответов

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

Это работает для меня:

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

Примечание:

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

21
ответ дан 24 May 2018 в 08:28
  • 1
    это, очевидно, гораздо правильный (tm) ответ. @ Рихард должен подумать о принятии этого вместо этого – nhed 23 December 2014 в 21:28
  • 2
    Команда global-status была введена в Vagrant 1.6 . Пользователи более старых версий Vagrant, особенно те, кто установил ее через apt-get и все еще могут быть на 1.4.3, должны будут обновить свою установку Vagrant, прежде чем они смогут использовать эту команду. – Curtis Gibby 21 October 2015 в 22:37
  • 3
    BSD xargs не поддерживает -r, поэтому вы можете установить gxargs через brew и использовать его вместо этого. – kenorb 8 April 2016 в 17:33

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

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 run останавливает бродягу для этого глобального уникального идентификатора

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

9
ответ дан 24 May 2018 в 08:28
  • 1
    Эта команда также работает для хостов OS X. Другие из-за различий в обработке аргументов командной строки между версиями OSX и Linux sed и awk. Благодаря! – Andrew Андрей Листочкин 19 January 2016 в 22:25
  • 2
    @ AndrewАндрейЛисточкин Подтвердить - работает на OS X 10 хорошо. Однако не тестировалось на других ОС. – setevoy 20 January 2016 в 13:46
  • 3
    Вышеупомянутая команда пытается остановить все поля, независимо от того, есть ли они или нет, и поэтому требуется много времени для выполнения. Для меня, поскольку я использую только виртуальный бокс, я изменил «виртуальный бокс». grep to " running & quot ;, чтобы получить только рабочие. – Alex2php 25 May 2016 в 13:26
  • 4
    Это хороший ответ, но вы можете использовать vagrant suspend вместо vagrant halt для сохранения состояния и приостановки для более быстрого перехода вниз и вверх. – David Thomas 16 October 2016 в 12:06
  • 5
    Правда, и если это сработает для вас, это здорово. У меня были проблемы с хронометражью с приостановленными виртуальными машинами в Virtualbox, поэтому я бы не рекомендовал его. – Aquarion 16 October 2016 в 21:23

В случае, если другие люди доберутся до этого вопроса: для тех, кто использует 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
ответ дан 24 May 2018 в 08:28

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

vagrant global-status | awk '/virtualbox running/{ print $1 }' | xargs vagrant halt
3
ответ дан 24 May 2018 в 08:28

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

2
ответ дан 24 May 2018 в 08:28

Если вы пишете скрипты для разбора команд 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 - Машиночитаемый вывод , например:

vagrant suspend '*'

, но он не работает

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

GH # 7220: Предоставить дополнительную информацию опции для фильтрации списка для бродячего глобального статуса. GH: # 7221: Реализовать - все для приостановления или бродяги приостановить - все.
1
ответ дан 24 May 2018 в 08:28

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

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
ответ дан 24 May 2018 в 08:28

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

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