bash 명령을 사용하기 쉬운 하나의 bash 명령 (bash 파일에 넣을 수 있음)으로 모든 VirtualBox (vagrant) VM 종료


70

나는 개발을 위해 방랑자 를 사용 합니다. 몇 개의 VM을 종료하는 것을 잊었습니다. 호스트 컴퓨터에서 로그 아웃하면 Ubuntu 종료 프로세스가 중단 된 것으로 나타납니다.

약간의 commandline-fu를 사용하여 모든 빈 상자를 닫는 방법이 있습니까? 다음과 같은 것이지만 잘 작동하는 것입니다.

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;

나는 방랑자를 모르지만 VirtualBox가 아닌 VMWare에 연결된 것 같습니다. 실제로 VirtualBox를 사용하고 있습니까?
terdon

@terdon : Vagrant는 처음에 Vbox 만 지원했습니다. 이제 다른 유형의 VM 형식 (VMWare 이해)을 지원한다고 생각합니다.
Sylvain Pineau

@SylvainPineau 아, 알았어. 방금 웹 페이지를 간단히 살펴보면서 "VMWare 통합"링크를보고 가정했습니다. 설명해 주셔서 감사합니다.
terdon

1
스크립트를 살펴 보겠습니다 . 전체 블로그 게시물은 여기에 있습니다 . 테스트되지 않음
Sylvain Pineau

Richard 질문에 대한 답변을 편집하지 마십시오. 당신은 별도의 답변으로 자신의 질문에 자유롭게 대답 할 수 있습니다. 나는 당신에게 좋은 질문에 대한 공감대를주었습니다.
don.joey

답변:


91

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를 안전하게 종료하는 방법

OP에서 업데이트

아래의 선택된 정답에 따라이 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 {} -다음 명령의 자리 표시 자로 {}를 사용합니다.

후 오후! 위의 조언을 감안할 때이 명령 행은 마술처럼 작동합니다. vboxmanage list runningvms | sed -r 's /.* \ {(. *) \} / \ 1 /'| xargs -L1 -I {} VBoxManage controlvm {} savestate
Rick

1
-r옵션은 GNU Sed에 고유합니다.
George V. Reilly

한동안 본 최고의 마법의 한 라이너! 잘 했어! : D
tftd

1
OSX / macOS에서는 -E대신 대신 사용해야 합니다 -r. 확장 정규식을 사용하기위한 플래그입니다.
JayD3e 2016 년

22

다른 답변은 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에 중점을 둔 다른 옵션 중 하나가 더 나을 수 있습니다.


4
이것은 분명히 훨씬 정확한 답변입니다. @Richard는 이것을 대신 수락하는 것을 고려해야합니다
nhed dec

global-status명령은 Vagrant 1.6에서 도입되었습니다 . 이전 버전의 Vagrant, 특히 apt-get1.4.3을 통해 설치 한 사용자는 이 명령을 사용하기 전에 Vagrant 설치를 업데이트해야합니다.
Curtis Gibby

1
BSD xargs는을 지원하지 않으므로을 통해 -r설치 gxargs하여 brew대신 사용할 수 있습니다.
kenorb

11

이것에 대한 나의 메커니즘 :

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

  • 전역 상태는 모든 상자를 나열합니다
  • 포함 된 줄에 대해 필터링 virtualbox하십시오 (도움말 텍스트 를 필터링하고 다른 공급자를 사용하는 경우 중단됩니다)
  • 처음 9 자 (글로벌 고유 ID) 만 표시하도록 필터링하십시오.
  • 우리는 여전히 그 입력에서 한 줄을 읽을 수 있지만 변수 $ line으로 읽습니다 :
    • 그 $ 라인을 인쇄
    • 실행 vagrant halt $line이 글로벌 고유 ID의 방랑을 중지

이것은 방랑자 구성 종료 메커니즘도 실행하기 때문에 위의 Virtualbox 방법보다 낫습니다.


3
이 명령은 OS X 호스트에서도 작동합니다. 기타 인해 OSX와 리눅스 버전 사이에 처리 명령 줄 인수의 차이로 실패 sed하고 awk. 감사!
Andrew Андрей Листочкин

@ AndrewАндрейЛисточкин Confirm-OS X 10에서 잘 작동합니다. 그래도 다른 OS에서는 테스트되지 않았습니다.
setevoy

2
위 명령은 실행 중인지 여부에 관계없이 모든 상자를 중지하려고하므로 실행하는 데 시간이 오래 걸립니다. 필자는 가상 상자 만 사용하므로 "virtualbox"grep을 "running"으로 변경하여 실행중인 가상 상자 만 가져 왔습니다.
Alex2php

이것은 좋은 대답이지만 , 상태를 저장하고 일시 중지 하는 vagrant suspend대신 사용 vagrant halt하여 더 빨리 위아래로 올리는 것이 좋습니다.
David Thomas

사실, 그것이 당신에게 효과적이라면 훌륭합니다. Virtualbox에서 일시 중단 된 VM에 대해 막대한 시간 관리 문제가 있었으므로 권장하지 않습니다.
Aquarion

5

다른 사람들 이이 질문에 직면하는 경우 : 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에서 테스트되었습니다.

모든 크레딧은 이 게시물 로 이동합니다 .


5

다른 답변 중 일부를 결합하면 실행중인 모든 virtualbox vagrant box가 닫힙니다.

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

이것은 나를 위해 일했다!
Gallardo

3

난 그냥 사용 vagrant halt합니다. 추가 인수없이 실행하면에 정의 된 모든 시스템이 중지됩니다 Vagrantfile.


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 post에 따라 VM 목록이 일시 중단되도록 정규식을 허용해야 합니다. 예를 들면 다음과 같습니다.

vagrant suspend '*'

그러나 작동하지 않으며 문제를 해결하기 위해 보류중인 버그 # 7221 이 있습니다.


관련 GitHub 티켓 :


0

이것은 당신을 위해 작동하거나 작동하지 않을 수 있습니다 ;-) 나를 위해 작동

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.