Um script de inicialização não é chamado no desligamento

2

Eu configurei um script de inicialização para controlar o estado de uma VM do VirtualBox:

#!/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

O sistema é o CentOS 6.5. Se eu executar manualmente o service [start|stop|status] vtigervm , ele funcionará como eu esperava. Se a VM estiver em execução, $? após o service vtigervm status retornar 0 e 3, se estiver parado. Eu instalei com chkconfig e criei entre alguns outros rc5.d/S99vtigervm e rc0.d/K05vtigervm .

O problema

Quando eu inicio o sistema, ele inicia o "serviço", mas no desligamento ele nem roda os scripts.

grep "virtual machine" /var/log/messages mostra:

*[machine starting]*
Called virtual machine management script with: start
Started virtual machine
*[shutdown -h now]*
*[machine stopped]*

O que eu espero:

*[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]*

Permissões de arquivo & etc:

# 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
    
por varesa 09.02.2014 / 01:20

2 respostas

4

Idéia # 1

Tente colocar um -x na parte superior do script de serviço, isso colocará o shell no modo de depuração para que você obtenha qualquer saída gerada pelo script.

#!/bin/sh -x

Idéia # 2

Você também pode querer adicionar o nome do processo ao topo das macros de comentário do chkconfig.

# processname: vtigervm

Você pode precisar alterar esse valor para o que for apropriado para sua situação.

Idéia # 3

Como sugerido na resposta @ RickBeam e confirmado por este link que encontrei nos fóruns do CentOS, intitulado : " chkconfig / init.d não está chamando o desligamento com a solução ", você precisará gerenciar a criação e destruição de um arquivo em /var/lock/subsys . Você pode adicionar essas linhas às funções start() e stop() para fazer isso:

start()
{
...
touch /var/lock/subsys/vtigervm
}

stop() {
...
rm -f /var/lock/subsys/vtigervm
}
    
por 09.02.2014 / 01:41
2

Seu script precisa tocar em /var/lock/subsys/... para indicar que está sendo executado. Veja os scripts atd ou crond init como um exemplo e /etc/rc para saber como ele é realmente analisado.

(Nota: Estou a ver o /etc/rc para o Fedora)

# 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
    
por 09.02.2014 / 01:40