Я использую бродягу для разработки. Я забываю закрывать несколько VMs. Когда я иду, чтобы выйти из моей хост-машины, процесс завершения работы Ubuntu, кажется, зависает.
Мог бы быть способ написать сценарий завершения всех бродячих полей с небольшим количеством командной-строки-fu? Что-то как следующее, но что-то, что, ну, в общем, работает.
for f in $HOME/vagrant;
do;
cd $f
vagrant halt
done;
Для 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 с помощью командной строки
На основе этого выбранного корректного ответа ниже, я добавил этот сценарий удара"$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 {}
- использование {} как заполнитель для следующей командыДругой ответ является большим для обработки Virtualbox, но функции Vagrant его собственные механизмы для обработки Виртуальных машин, и как был упомянут в одном из комментариев, это поддерживает больше, чем просто VirtualBox, просто VMware в данный момент, но кто знает позже!
Это, кажется, работает на меня:
vagrant global-status | awk '/running/{print $1}' | xargs -r -d '\n' -n 1 -- vagrant suspend
Примечание:
Это работает с Бродячими версиями после 1.6 для более старых версий, необходимо, вероятно, обновить, но если Вы не можете, одна из других опций, которая фокусируется на Virtualbox, может быть лучше.
Мой механизм для этого:
vagrant global-status | grep virtualbox | cut -c 1-9 | while read line; do echo $line; vagrant halt $line; done;
virtualbox
(Отфильтровывает текст справки, повредит, если Вы будете использовать некоторого другого поставщика) vagrant halt $line
остановка бродяги для того глобального уникального идентификатора , Это лучше, чем метод Virtualbox выше, потому что это выполнит любые настроенные бродягами механизмы завершения работы также.
В случае, если другие люди добираются до этого вопроса: Для тех, которые используют 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.
Весь кредит переходит в это сообщение .
Комбинируя некоторые из других ответов, это закроет все выполнение virtualbox бродячие поля:
vagrant global-status | awk '/virtualbox running/{ print $1 }' | xargs vagrant halt
Я просто использую vagrant halt
. При выполнении его без дальнейшего аргумента это останавливает все машины, определенные в Vagrantfile
.
Если Вы пишете сценарии для парсинга Бродячих команд, рекомендуется проанализировать благоприятный для машины вывод (--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:
Это может или не может работать на Вас ;-) Работы для меня
#!/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
Вот подборка рабочих однострочников по состоянию на сентябрь 2020 года. Спасибо всем предыдущим авторам за вдохновение.
vagrant global-status | awk '/virtualbox running/{ print $1 }' | xargs vagrant halt
Совместимость с 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
Я рекомендую использовать остановить
для веб-серверов; это экономит место на диске и может быть быстрее.