Saya menggunakan gelandangan untuk pengembangan. Saya lupa mematikan beberapa VM. Ketika saya pergi untuk keluar dari mesin host saya, proses shutdown Ubuntu tampaknya hang.
Mungkinkah ada cara untuk menutup semua kotak gelandangan dengan sedikit commandline-fu? Sesuatu seperti yang berikut ini, tetapi sesuatu yang, yah, bekerja.
for f in $HOME/vagrant;
do;
cd $f
vagrant halt
done;
Jawaban:
Untuk kontrol skrip mesin Virtual Box, kami dapat menggunakan perintah VBoxManage :
Daftar mesin yang berjalan (mengembalikan nama dan UUID):
Hentikan menjalankan VM dengan "hibernasi" mereka (direkomendasikan untuk menghindari kehilangan data)
Poweroff menjalankan VMs (tidak disarankan karena kami dapat kehilangan data di tamu)
Gunakan ACPI dalam OS tamu yang sadar ACPI (lebih disukai daripada
poweroff
untuk tamu yang ramah)Lihat juga: Cara mematikan OS Tamu di VirtualBox menggunakan baris perintah
Perbarui dari OP
Berdasarkan jawaban yang benar yang dipilih di bawah ini, saya telah menambahkan skrip bash ini "
$HOME/bin/stop-vagrant.sh
". Jadi sekarang saya memiliki sesuatu yang dapat dengan aman memulai penghentian semua VM gelandangan yang mungkin telah saya nyalakan namun terlupakan dalam suatu sesi.Perintah Dijelaskan:
vboxmanage list runningvms |
- Mendapat daftar semua vms yang berjalan di bawah VirtualBoxsed -r 's/.*\{(.*)\}/\1/' |
- menghapus string ke nomor idxargs -L1 -I {} VBoxManage controlvm {} savestate
- Menjalankan perintah save state pada setiap kotak yang terbuka.Di
xargs
-L1
- ambil satu baris sekaligus-I {}
- menggunakan {} sebagai penampung untuk perintah selanjutnyasumber
-r
opsi ini unik untuk GNU Sed.-E
sebagai ganti-r
. Ini adalah bendera untuk menggunakan ekspresi reguler yang diperluas.Jawaban lainnya sangat bagus untuk menangani Virtualbox, tetapi Vagrant fitur mekanisme sendiri untuk menangani Mesin Virtual, dan seperti yang disebutkan dalam salah satu komentar, itu mendukung lebih dari sekedar VirtualBox, hanya VMWare saat ini, tetapi siapa yang tahu nanti!
Ini sepertinya bekerja untuk saya:
catatan:
Ini bekerja dengan versi Vagrant setelah 1.6, untuk versi yang lebih lama, Anda mungkin harus meningkatkan, tetapi jika Anda tidak bisa, salah satu opsi lain yang berfokus pada Virtualbox mungkin lebih baik.
sumber
global-status
komando diperkenalkan di Vagrant 1,6 . Pengguna pada versi Vagrant yang lebih lama, terutama mereka yang telah menginstalnya melaluiapt-get
dan mungkin masih di 1.4.3, perlu memperbarui instalasi Vagrant mereka sebelum mereka dapat menggunakan perintah ini.xargs
tidak mendukung-r
, karena itu Anda dapat menginstalgxargs
viabrew
dan menggunakannya sebagai gantinya.Mekanisme saya untuk ini:
vagrant global-status | grep virtualbox | cut -c 1-9 | while read line; do echo $line; vagrant halt $line; done;
virtualbox
(Menyaring teks bantuan, akan rusak jika Anda menggunakan beberapa penyedia lain)vagrant halt $line
menghentikan gelandangan untuk ID unik global ituIni lebih baik daripada metode Virtualbox di atas, karena itu akan menjalankan mekanisme shutdown yang dikonfigurasi gelandangan juga.
sumber
sed
danawk
. Terima kasih!vagrant suspend
alih-alihvagrant halt
menyimpan status dan menangguhkan untuk naik turun lebih cepat.Dalam kasus orang lain sampai ke pertanyaan ini: Bagi mereka yang menggunakan VirtualBox, itu sudah dapat mengatasi ini, hanya melibatkan pengeditan file:
Sisi
init.d
baiknya adalah tidak perlu mengedit / membuat logout atau stript untuk menjalankan perintah yang diposting dalam jawaban lain. Kelemahannya adalah solusi ini khusus untuk VirtualBox.Diuji pada Ubuntu 14.10 dengan VirtualBox 4.3.18.
Semua kredit masuk ke pos ini .
sumber
Menggabungkan beberapa jawaban lain, ini akan menutup semua menjalankan kotak gelandangan virtualbox:
sumber
Saya hanya menggunakan
vagrant halt
. Jika Anda menjalankannya tanpa argumen lebih lanjut, itu menghentikan semua mesin yang didefinisikan dalamVagrantfile
.sumber
Jika Anda menulis skrip untuk mem-parsing perintah-perintah Vagrant, disarankan untuk mengurai output ramah-mesin (
--machine-readable
) yang lebih konsisten.Formatnya adalah:
jadi Anda dapat mengimpornya sebagai file CSV, karena dipisahkan oleh koma.
Dengan shell, mungkin lebih sulit untuk diurai, misalnya:
Lihat: Vagrant - Output yang dapat dibaca mesin
Namun saya merasa lebih mudah untuk mem-parsing output standar, misalnya
Btw. Secara teoritis
vagrant
perintah harus menerima ekspresi reguler untuk daftar VM yang ditangguhkan sesuai pos GH ini , misalnya:tetapi itu tidak bekerja dan ada bug # 7221 yang tertunda untuk memperbaikinya.
Tiket GitHub terkait:
sumber
Ini mungkin atau mungkin tidak bekerja untuk Anda ;-) Bekerja untuk saya
vagrant_halt_all.sh
sumber