Tek bir kolay kullanımlı bash komutunda tüm VirtualBox (vagrant) VM'lerini kapatma (bu bir bash dosyasına yerleştirilebilir)

65

Geliştirme için vagrant kullanıyorum. Birkaç VM'yi kapatmayı unuttum. Ana bilgisayarımdan çıkış yapmaya gittiğimde Ubuntu kapatma işlemi askıda kalıyor.

Bütün vagrant kutularının bir kısmını komut satırı-fu ile kapatmanın bir yolu olabilir mi? Aşağıdaki gibi bir şey, ama bir şey, iyi çalışır.

for f in $HOME/vagrant;
do;
  cd $f
  vagrant halt
done;
    
sordu Rick 29.04.2014 00:59

8 cevap

82

Sanal Kutu makinelerinin betik kontrolü için VBoxManage 'ı kullanabiliriz komutlar:

  • Çalışan makineleri listele (geri dönüş adı ve UUID):

    VBoxManage list runningvms
    
  • VM'leri "hazırda bekleterek" çalıştırarak durdurun (veri kaybını önlemek için yeniden düzenlendi)

    VBoxManage controlvm <name|uuid> savestate
    
  • VM'ler çalıştıran Poweroff (konukta verileri kaybedebileceğimiz için önerilmez)

    VBoxManage controlvm <name|uuid> poweroff
    
  • ACPI'nin farkında olduğu bir misafir işletim sisteminde ACPI kullanın (misafirlerin zarif kapanması için poweroff 'ye tercih edilir)

    VBoxManage controlvm <name|uuid> acpipowerbutton
    

Ayrıca bkz .: Nasıl güvenli bir şekilde kapatılır? VirtualBox'ta komut satırı kullanarak misafir işletim sistemi

OP'den Güncelle

Aşağıda bu doğru yanıtı temel alarak, " $HOME/bin/stop-vagrant.sh " bu bash komut dosyasını ekledim. Şimdi, bir oturumda henüz unutulmuş olabildiğim tüm vagrant VM'lerin güvenli bir şekilde durabileceği bir şey var.

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

Komutu Açıklandı:

vboxmanage list runningvms | - VirtualBox altındaki tüm çalışan vms'nin listesini alır

sed -r 's/.*\{(.*)\}//' | - dizeyi kimlik numarasına indirir

xargs -L1 -I {} VBoxManage controlvm {} savestate - açık olan her kutuda kayıt durumu komutunu çalıştırır.

Açık xargs

  • -L1 - bir seferde bir satır alın
  • -I {} - {} bir sonraki komut için bir yer tutucu olarak kullanılır
verilen cevap Takkat 29.04.2014 11:31
21

Diğer cevap, Virtualbox'ın kullanımı için harika, ancak Vagrant, Sanal Makinelerin kullanımıyla ilgili kendi mekanizmalarını içeriyor ve yorumlardan birinde bahsedildiği gibi, şu anda sadece VMWare'den daha fazlasını destekliyor. !

Bu benim için çalışıyor gibi görünüyor:

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

Not:

Bu, Vagrant sürümleriyle 1.6'dan sonra çalışır, daha eski sürümler için, muhtemelen yükseltmelisiniz, ancak yapamazsanız, Virtualbox'a odaklanan diğer seçeneklerden biri daha iyi olabilir.

    
verilen cevap ThomasRedstone 23.12.2014 15:35
9

Bunun için mekanizmam:

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

  • global durum tüm kutuları listeler
  • virtualbox içeren satırlar için bunu filtreleyin (Yardım metnini filtreler, başka bir sağlayıcı kullanıyorsanız kırılır)
  • Yalnızca ilk 9 karakteri (global benzersiz kimlik) görüntülemek için filtreleyin
  • Hâlâ bu girişten bir satır okuyabiliyorken, $ line değişkenini okuyabilirsiniz:
    • Yazdırın $ satırı
    • koşmak vagrant halt $line o benzersiz benzersiz kimliği için vagrantı durdurma

Bu, yukarıdaki Virtualbox yönteminden daha iyidir, çünkü herhangi bir vagrant yapılandırılmış kapatma mekanizması da çalıştırır.

    
verilen cevap Aquarion 03.05.2015 09:21
5

Diğer kişilerin bu soruya ulaşması halinde: VirtualBox kullananlar için, bununla ilgilenebilir, sadece bir dosyayı düzenlemeyi içerir:

# 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

Diğer yanıtlar, diğer cevaplarda gönderilen komutları çalıştırmak için herhangi bir çıkış veya init.d striptiğini düzenlemek / oluşturmak için gerekli değildir. Bu olumsuz, VirtualBox'a özgü bir çözümdür.

Ubuntu 14.10'da VirtualBox 4.3.18 ile test edilmiştir.

Tüm krediler bu gönderiye gider.

    
verilen cevap Armando Pérez Marqués 11.04.2015 19:54
3

Diğer cevapların bir kısmını birleştiren bu, çalışan tüm sanal posta kutularını kapatır:

vagrant global-status | awk '/virtualbox running/{ print  }' | xargs vagrant halt
    
verilen cevap Ryan 15.03.2016 15:51
2

Sadece vagrant halt kullanıyorum. Başka bir argüman olmadan çalıştırırsanız, Vagrantfile 'de tanımlanan tüm makineleri durdurur.

    
verilen cevap nomen 15.03.2016 04:42
1

Vagrant komutlarını ayrıştırmak için komut dosyaları yazıyorsanız, daha tutarlı olan makine dostu çıktıları ( --machine-readable ) ayrıştırmanız önerilir.

Biçim:

timestamp,target,type,data...

Böylece, virgülle ayrılmış olduğundan, CSV dosyası olarak içe aktarabilirsiniz.

Kabuk ile, ayrıştırmak daha zor olabilir, örneğin:

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

Bakınız: Vagrant - Makine tarafından okunabilir çıktı

Ancak standart çıktıyı ayrıştırmayı daha kolay buluyorum, ör.

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

Btw. Teorik olarak vagrant komutu, bu GH'ye göre askıya alınacak VM'lerin listesi için düzenli bir ifadeyi kabul etmelidir Gönderi , örneğin:

vagrant suspend '*'

ancak çalışmıyor ve düzeltmek için bekleyen bir hata # 7221 var. .

İlgili GitHub biletleri:

verilen cevap kenorb 08.04.2016 22:14
0

Bu sizin için işe yarayabilir ya da çalışmayabilir ;-) Benim için çalışır

vagrant_halt_all.sh

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

for i in $(vagrant global-status | grep running | awk '{print }'); do 
  DIR=$(vagrant global-status | grep running | awk '{print }')
  cd "$DIR";
  OUT=$(vagrant halt);
  echo "attempted to halt $i: $OUT"
done
    
verilen cevap brad parks 11.04.2018 20:23

Etiketlerdeki diğer soruları oku