web-dev-qa-db-ja.com

シャットダウン時にinit-scriptが呼び出されない

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/S99vtigervmrc0.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
2
varesa

アイデア#1

サービススクリプトの先頭に_-x_を配置してみてください。これにより、シェルがデバッグモードになり、スクリプトによって生成されている出力を取得できるようになります。

_#!/bin/sh -x
_

アイデア#2

また、chkconfigコメントマクロの先頭にもプロセス名を追加することをお勧めします。

_# processname: vtigervm
_

この値を状況に適した値に変更する必要がある場合があります。

アイデア#3

@ 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
}
_
4
slm

スクリプトが実行中であることを示すには、スクリプトを/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
2
Ricky Beam