スクリプトは suspend-to-hibernate.service からではなく、ターミナルから実行されます。

スクリプトは suspend-to-hibernate.service からではなく、ターミナルから実行されます。

実行中の仮想マシンがあるかどうかを確認し、ある場合はそれらを正常にシャットダウンする (VBoxManage を使用) スクリプトがあります。これは、マシンから呼び出された場合、VM で実行されているデータベースが再開されたときに時間のジャンプによる問題が発生しないようにするためのものです。

スクリプトはコマンド ラインからは正常に実行されますが、私が作成した suspend-to-hibernate.service ファイルから呼び出された場合は実行されません。

スクリプトは VBoxManage を呼び出して実行中のマシンをリストし、それを awk にパイプして VM の名前を抽出し、それをすべて別のファイルにダンプして、マシンをシャットダウンするために呼び出されるはずです。

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

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

予想される 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

関連情報