Çalışan tüm VirtualBox VM'lerini askıya alacak bir python betiği oluşturdum ve ardından sistemi oturum açmada komut dosyasını zamanlanmış bir görev olarak çalıştıracak şekilde ayarladım.
Bu yöntemin tam olarak ne kadar güvenilir olduğunu bilmiyorum. Diğerlerinin de belirttiği gibi , sistemin bir Winlogon 7002 görevinin tamamlanmasını ne kadar bekleyeceği konusunda sınırlamalar vardır. Ancak kişisel olarak, 4+ GB'lık genel VM RAM'de birden fazla çalışan VM ile bile kullanılabilir kaydetme durumları sağlamada herhangi bir sorun yaşamadım.
Ayarlamak için adımlar şunlardır:
- Python.org'dan Python 2.7.x dosyasını indirip yükleyin
- Not Defteri veya başka bir düz metin düzenleyici kullanarak python komut dosyasını sisteminizde bir yerde oluşturun (aşağıya bakın)
- Görev Zamanlayıcı'yı aç
- Eylem -> Temel Görev Oluştur ... seçeneğini belirleyin ve aşağıdaki ayarlarla bir görev oluşturmak için sihirbazı kullanın
- Seçtiğiniz bir isim
- Belirli bir olay günlüğe kaydedildiğinde görevi başlatın
- Günlük: Sistem
- Kaynak: Winlogon
- Olay Kimliği: 7002
- Bir Program Başlat
- Sonraki Program / Komut , Blogunuza tam yolunu girin
python.exe
örneğinc:\Python27\python.exe
- Nin yanında argümanlar ekle Bu yüzden mesela, piton komut dosyası koymak tam yolunu girin, ben klasörü benim belgelerin bir alt mayın koymak
C:\Users\rakslice\Documents\vboxsuspend\vboxsuspend.py
- Son'u seçin.
Artık VirtualBox VM'lerinin oturum kapatma / yeniden başlatma / kapatma sırasında askıya alınması gerekir.
Kapatmayı yapacak python betiği aşağıdadır:
# A script to suspend all running VirtualBox VMs
import os
import subprocess
import sys
class VM(object):
def __init__(self, name, uuid):
self.name = name
self.uuid = uuid
def __repr__(self):
return "VM(%r,%r)" % (self.name, self.uuid)
class VBoxRunner(object):
def __init__(self):
program_files = os.environ["ProgramW6432"]
vbox_dir = os.path.join(program_files, "Oracle", "VirtualBox")
self.vboxmanage_filename = os.path.join(vbox_dir, "VBoxManage.exe")
def vbox_run(self, *args):
subprocess.check_call([self.vboxmanage_filename] + list(args))
def vbox_run_output(self, *args):
return subprocess.check_output([self.vboxmanage_filename] + list(args))
def list(self, running=True):
if running:
list_cmd = "runningvms"
else:
list_cmd = "vms"
return [self.parse_vm_list_entry(x) for x in self.vbox_run_output("list", list_cmd).strip().split("\n")]
def suspend_all(self):
success = True
stopped_some_vms = False
vms = self.list(running=True)
for vm in vms:
if vm is None:
continue
# noinspection PyBroadException
try:
self.suspend_vm(vm)
except:
success = False
else:
stopped_some_vms = True
if not stopped_some_vms:
self.message("No running vms")
return success
@staticmethod
def parse_vm_list_entry(x):
""":type x: str"""
if not x.startswith('"'):
return None
end_pos = x.find('"', 1)
if end_pos == -1:
return None
name = x[1:end_pos]
assert x[end_pos + 1: end_pos + 3] == " {"
assert x.endswith("}")
uuid = x[end_pos + 2:]
return VM(name, uuid)
@staticmethod
def message(msg):
print >>sys.stderr, msg
def suspend_vm(self, vm):
assert isinstance(vm, VM)
self.vbox_run("controlvm", vm.uuid, "savestate")
def main():
vr = VBoxRunner()
success = vr.suspend_all()
if not success:
sys.exit(1)
if __name__ == "__main__":
main()