나는 개발을 위해 방랑자 를 사용 합니다. 몇 개의 VM을 종료하는 것을 잊었습니다. 호스트 컴퓨터에서 로그 아웃하면 Ubuntu 종료 프로세스가 중단 된 것으로 나타납니다.
약간의 commandline-fu를 사용하여 모든 빈 상자를 닫는 방법이 있습니까? 다음과 같은 것이지만 잘 작동하는 것입니다.
for f in $HOME/vagrant;
do;
cd $f
vagrant halt
done;
나는 개발을 위해 방랑자 를 사용 합니다. 몇 개의 VM을 종료하는 것을 잊었습니다. 호스트 컴퓨터에서 로그 아웃하면 Ubuntu 종료 프로세스가 중단 된 것으로 나타납니다.
약간의 commandline-fu를 사용하여 모든 빈 상자를 닫는 방법이 있습니까? 다음과 같은 것이지만 잘 작동하는 것입니다.
for f in $HOME/vagrant;
do;
cd $f
vagrant halt
done;
답변:
Virtual Box 머신의 스크립트 가능한 제어를 위해 VBoxManage 명령을 사용할 수 있습니다 .
실행중인 머신 나열 (이름 및 UUID 반환) :
VBoxManage list runningvms
"최대 절전 모드"로 VM 실행 중지 (데이터 손실을 피하기 위해 권장)
VBoxManage controlvm <name|uuid> savestate
실행중인 VM 전원 끄기 (게스트에서 데이터가 손실 될 수 있으므로 권장되지 않음)
VBoxManage controlvm <name|uuid> poweroff
ACPI 인식 게스트 OS에서 ACPI 사용 (게스트 poweroff
를 정상적으로 종료하는 것이 좋습니다)
VBoxManage controlvm <name|uuid> acpipowerbutton
참조 : 명령 줄을 사용하여 VirtualBox에서 게스트 OS를 안전하게 종료하는 방법
아래의 선택된 정답에 따라이 bash 스크립트 " $HOME/bin/stop-vagrant.sh
"를 추가했습니다 . 이제 세션에서 설정하지 않은 모든 가상 머신을 안전하게 중지 할 수있는 기능이 있습니다.
vboxmanage list runningvms | sed -r 's/.*\{(.*)\}/\1/' | xargs -L1 -I {} VBoxManage controlvm {} savestate
vboxmanage list runningvms |
-VirtualBox에서 실행중인 모든 vms 목록을 가져옵니다.
sed -r 's/.*\{(.*)\}/\1/' |
-문자열을 id 번호로 줄입니다.
xargs -L1 -I {} VBoxManage controlvm {} savestate
-열려있는 각 상자에서 save state 명령을 실행합니다.
의 위에 xargs
-L1
-한 번에 한 줄씩 -I {}
-다음 명령의 자리 표시 자로 {}를 사용합니다.-r
옵션은 GNU Sed에 고유합니다.
-E
대신 대신 사용해야 합니다 -r
. 확장 정규식을 사용하기위한 플래그입니다.
다른 답변은 Virtualbox를 처리하는 데 유용하지만 Vagrant는 Virtual Machines를 처리하는 자체 메커니즘을 제공하며 의견 중 하나에서 언급했듯이 현재 VirtualWare뿐만 아니라 현재 VMWare 만 지원하지만 나중에 알고있는 사람을 지원합니다!
이것은 나를 위해 작동하는 것 같습니다 :
vagrant global-status | awk '/running/{print $1}' | xargs -r -d '\n' -n 1 -- vagrant suspend
노트 :
1.6 이후의 Vagrant 버전에서 작동합니다. 이전 버전의 경우 업그레이드해야 할 수 있지만 업그레이드 할 수없는 경우 Virtualbox에 중점을 둔 다른 옵션 중 하나가 더 나을 수 있습니다.
global-status
명령은 Vagrant 1.6에서 도입되었습니다 . 이전 버전의 Vagrant, 특히 apt-get
1.4.3을 통해 설치 한 사용자는 이 명령을 사용하기 전에 Vagrant 설치를 업데이트해야합니다.
xargs
는을 지원하지 않으므로을 통해 -r
설치 gxargs
하여 brew
대신 사용할 수 있습니다.
이것에 대한 나의 메커니즘 :
vagrant global-status | grep virtualbox | cut -c 1-9 | while read line; do echo $line; vagrant halt $line; done;
virtualbox
하십시오 (도움말 텍스트 를 필터링하고 다른 공급자를 사용하는 경우 중단됩니다)vagrant halt $line
이 글로벌 고유 ID의 방랑을 중지이것은 방랑자 구성 종료 메커니즘도 실행하기 때문에 위의 Virtualbox 방법보다 낫습니다.
sed
하고 awk
. 감사!
vagrant suspend
대신 사용 vagrant halt
하여 더 빨리 위아래로 올리는 것이 좋습니다.
다른 사람들 이이 질문에 직면하는 경우 : 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
단점은 다른 답변에 게시 된 명령을 실행하기 위해 로그 아웃이나 스플릿을 편집 / 생성 할 필요가 없다는 것입니다. 단점은이 솔루션이 VirtualBox에만 적용된다는 것입니다.
VirtualBox 4.3.18을 사용하여 Ubuntu 14.10에서 테스트되었습니다.
모든 크레딧은 이 게시물 로 이동합니다 .
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 post에 따라 VM 목록이 일시 중단되도록 정규식을 허용해야 합니다. 예를 들면 다음과 같습니다.
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