VirtualBoxVMの状態を制御するinit-scriptを設定しました。
#!/bin/sh
#chkconfig: 35 99 5
#description: vTiger virtual machine
### BEGIN INIT INFO
# Provides: vtigervm
# Required-Start: $local_fs
# Requider-Stop: $stop_fs
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: Manage vTiger virtual machine
# Description: Utility to start and stop vTiger virtual machine on VirtualBox
### END INIT INFO
start()
{
echo -n "Starting vTiger"
echo
su myuser -c '/usr/bin/VBoxManage startvm "vTiger" --type headless'
echo "Started virtual machine" >> /var/log/messages
}
stop()
{
echo -n "Shutting vTiger down..."
echo
su myuser-c '/usr/bin/VBoxManage controlvm "vTiger" acpipowerbutton'
while [ ! -z "`su - juhani -c '/usr/bin/VBoxManage list runningvms | grep vTiger'`" ]; do
echo -n "."
sleep 1
done
echo "Done."
echo "Stopped virtual machine" >> /var/log/messages
}
status()
{
echo -n "Running VMs: "
su myuser -c '/usr/bin/VBoxManage list runningvms'
echo
if [ -z "`su - juhani -c '/usr/bin/VBoxManage list runningvms | grep vTiger'`" ]; then
RETVAL=3
else
RETVAL=0
fi
echo "Queried virtual machine status" >> /var/log/messages
}
echo "Called virtual machine management script with: $1" >> /var/log/messages
case "$1" in
start)
start
;;
stop)
stop
;;
restart|try-restart|condrestart|reload)
stop
start
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit $RETVAL
システムはCentOS6.5です。手動でservice [start|stop|status] vtigervm
を実行すると、期待どおりに機能します。 VMが実行されている場合、$?
の後のservice vtigervm status
は0を返し、停止している場合は3を返します。chkconfig
を使用してインストールし、作成しました。他のいくつかの中でrc5.d/S99vtigervm
とrc0.d/K05vtigervm
。
システムを起動すると「サービス」が開始されますが、シャットダウンするとスクリプトも実行されません。
grep "virtual machine" /var/log/messages
は以下を示しています:
*[machine starting]*
Called virtual machine management script with: start
Started virtual machine
*[shutdown -h now]*
*[machine stopped]*
*[machine starting]*
Called virtual machine management script with: start
Started virtual machine
*[shutdown -h now]*
Called virtual machine management script with: status
Queried virtual machine status
Called virtual machine management script with: stop
Stopped virtual machine
*[machine stopped]*
# ls -lah /etc/rc0.d/
lrwxrwxrwx. 1 root root 13 7.2. 17:49 /etc/rc0.d/K05atd -> ../initd.d/atd
lrwxrwxrwx. 1 root root 18 9.2. 00:06 /etc/rc0.d/K05vtigervm -> ../initd.d/vtigervm
サービススクリプトの先頭に_-x
_を配置してみてください。これにより、シェルがデバッグモードになり、スクリプトによって生成されている出力を取得できるようになります。
_#!/bin/sh -x
_
また、chkconfigコメントマクロの先頭にもプロセス名を追加することをお勧めします。
_# processname: vtigervm
_
この値を状況に適した値に変更する必要がある場合があります。
@ RickBeam's で提案され、CentOSフォーラムで見つけたこのリンクで確認されたように: " chkconfig/init.d not call shutdown with solution " _/var/lock/subsys
_でファイルの作成と破棄を管理する必要があります。これらの行をstart()
およびstop()
関数に追加して次のようにすることができます。
_start()
{
...
touch /var/lock/subsys/vtigervm
}
stop() {
...
rm -f /var/lock/subsys/vtigervm
}
_
スクリプトが実行中であることを示すには、スクリプトを/var/lock/subsys/...
にタッチする必要があります。例としてatd
またはcrond
initスクリプトを見て、実際にどのように解析されるかについては/etc/rc
を見てください。
(注:Fedoraの/etc/rc
を見ています)
# First, run the KILL scripts.
for i in /etc/rc$runlevel.d/K* ; do
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/K??}
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
|| continue
check_runlevel "$i" || continue
# Bring the subsystem down.
[ -n "$UPSTART" ] && initctl emit --quiet stopping JOB=$subsys
$i stop
[ -n "$UPSTART" ] && initctl emit --quiet stopped JOB=$subsys
done