
Ich habe ein Skript, das überprüft, ob virtuelle Maschinen ausgeführt werden, und sie ggf. ordnungsgemäß herunterfährt (verwendet VBoxManage). Die Idee dahinter ist, dass, wenn ich von meiner Maschine weggerufen werde, in VMs ausgeführte Datenbanken bei der Wiederaufnahme keine Probleme durch Zeitsprünge haben.
Das Skript wird von der Befehlszeile aus ordnungsgemäß ausgeführt, jedoch nicht, wenn es von der von mir erstellten Datei „suspend-to-hibernate.service“ aufgerufen wird!
Folgendes sollte passieren: Das Skript ruft VBoxManage auf, um laufende Maschinen aufzulisten, leitet diese Daten an awk weiter, um den Namen der VM zu extrahieren, und schreibt alles in eine andere Datei, die dann aufgerufen wird, um die Maschinen herunterzufahren.
Es läuft gut, bis VBoxManage aufgerufen wird – es scheint, dass der Befehl einfach nicht ausgeführt wird. /usr/bin/VBoxManage ist eigentlich ein Link zu einem Skript, das /usr/lib/virtualbox/VBoxManage aufruft. Ich habe versucht, es direkt aufzurufen, aber es läuft immer noch nicht.
Das stop-vms.log zeigt, dass das „On the Fly“-Skript tatsächlich ausgeführt wird.
Es ist eine Weile her, seit ich Unix-Skripte geschrieben habe, und ich habe das Gefühl, dass ich etwas sehr Einfaches übersehen habe ...
suspend-to-hibernate.service:
[Unit]
Description=Script to check for VirtualBox VMs and pause them
Conflicts=hibernate.target hybrid-suspend.target
Before=suspend.target sleep.target
StopWhenUnneeded=true
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh /home/steve/Documents/scripts/stop-vms.sh suspend
[Install]
WantedBy=sleep.target
RequiredBy=suspend.target
stop-vms.sh:
#!/bin/sh
# some vars:
NEWSCRIPT=/home/steve/Documents/scripts/stopvms
SHELL=/bin/sh
LOGFILE=/home/steve/logs/stop-vms.log
# check if script file exists, if not create & make executable
if [ ! -e $NEWSCRIPT ]
then
touch $NEWSCRIPT
chmod 775 $NEWSCRIPT
fi
# tell the script where the shell is
echo '#!'$SHELL > $NEWSCRIPT
echo '#starting at:' `date` >> $NEWSCRIPT
# get list of running machines and dump into script file
echo 'echo "running vms" >> /home/steve/logs/stop-vms.log' >> $NEWSCRIPT
/usr/bin/VBoxManage list runningvms | awk '{print "/usr/lib/virtualbox/VBoxManage controlvm " substr($line, 1, index($line,"{")-2) " acpipowerbutton >> /home/steve/logs/stop-vms.log "} ' >> $NEWSCRIPT
echo 'vms done, about to run script at ' `date` >> $LOGFILE
# run the script
$NEWSCRIPT
# now wait to make sure the previous command has had time to finish...
sleep 30
# report on last run...
echo >> $NEWSCRIPT
echo '# Last Run: ' `date` >> $NEWSCRIPT
Erwartetes Stopvms-Skript (bei Ausführung vom Terminal aus)
#!/bin/sh
#starting at: Wed 31 Jan 10:24:34 GMT 2018
echo "running vms" >> /home/steve/logs/stop-vms.log
/usr/lib/virtualbox/VBoxManage controlvm "Dev Mysql GlassFish" acpipowerbutton >> /home/steve/logs/stop-vms.log
# Last Run: Wed 31 Jan 10:25:04 GMT 2018
Tatsächlich beim Ausführen von suspend-to-hibernate.service:
#!/bin/sh
#starting at: Wed 31 Jan 10:59:26 GMT 2018
echo "running vms" >> /home/steve/logs/stop-vms.log
# Last Run: Wed 31 Jan 10:59:56 GMT 2018