
У меня есть скрипт, который проверяет, запущены ли какие-либо виртуальные машины, и, если они есть, корректно завершает их работу (используя VBoxManage). Идея заключается в том, что если меня вызовут с моей машины, то работающие на виртуальных машинах базы данных не будут испытывать проблем из-за скачков времени при возобновлении работы.
Скрипт нормально запускается из командной строки, но не при вызове из созданного мной файла suspend-to-hibernate.service!
Должно произойти следующее: скрипт вызывает VBoxManage для получения списка работающих машин, передает его в awk для извлечения имени виртуальной машины и сохраняет все это в другом файле, который затем вызывается для завершения работы машин.
Он работает хорошо до вызова VBoxManage - похоже, что команда просто не запускается. /usr/bin/VBoxManage на самом деле является ссылкой на скрипт, который вызывает /usr/lib/virtualbox/VBoxManage. Я пробовал вызывать его напрямую, но все равно не запускается.
Файл stop-vms.log показывает, что скрипт «на лету» действительно выполняется.
Прошло уже некоторое время с тех пор, как я последний раз занимался написанием скриптов для Unix, и у меня такое чувство, что я упустил что-то очень простое...
приостановить-перейти-в-спящий.сервис:
[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
стоп-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
Ожидается скрипт stopvms (при запуске из терминала)
#!/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
Актуально при запуске из 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