init.d não executando o comando stop na reinicialização

1

Eu tenho um script init.d para iniciar um script Python:

#!/bin/sh
#
###############################################################################
# sd-agent
#
# Written by Boxed Ice <[email protected]>
# A server monitoring daemon for www.serverdensity.com
#
# Licensed under Simplified BSD License (see LICENSE)
#
###############################################################################
#
# chkconfig: 345 85 15
# description: Server Density Monitoring Agent

AGENTPATH="/usr/bin/sd-agent/agent.py"

[ -f $AGENTPATH ] || echo "/usr/bin/sd-agent not found"

# Source function library.
if [ -f /etc/init.d/functions ]; then
        . /etc/init.d/functions
fi

if [ -f /etc/SuSE-release ]; then
        . /etc/rc.status
        rc_reset
fi

# Action to take
case "$1" in
  start)
        python $AGENTPATH start
        if [ -f /etc/SuSE-release ]; then
                rc_status -v
        elif [ -f /etc/debian_version ] || [ -f /etc/lsb-release ] || [ -f /etc/gentoo-release ]; then
                echo " Started"
        else
                success
                echo
        fi
        echo
    ;;
  stop)
        python $AGENTPATH stop

        if [ -f /etc/SuSE-release ]; then
                rc_status -v
        elif [ -f /etc/debian_version ] || [ -f /etc/lsb-release ] || [ -f /etc/gentoo-release ]; then
                echo " Stopped"
        else
                success
                echo
        fi
        echo
    ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: /etc/init.d/sd-agent start|stop|restart"
        exit 1
esac

exit 0

Isso foi "instalado" no chkconfig:

[root@test ~]# chkconfig --list sd-agent
sd-agent        0:off   1:off   2:off   3:on    4:on    5:on    6:off

Se eu executar:

service sd-agent start

Em seguida, o script é executado conforme o esperado. O código Python cria um arquivo PID em /tmp/sd-agent.pid como deveria. Igualmente, se eu executar

service sd-agent stop

o script é encerrado e o arquivo PID é removido.

Se eu parar o script e reinicializar o servidor, ele será iniciado quando o servidor concluir o ciclo de inicialização. Isso é esperado porque eu configurei para fazer isso com o chkconfig.

No entanto, se eu iniciar o script e reinicializar o servidor, o comando de parada não parece ser executado porque, quando o servidor volta, o antigo arquivo /tmp/sd-agent.pid ainda existe. Isso está impedindo que o comando start seja executado porque verifica a existência do arquivo PID e não será iniciado se já existir um.

Parece que o comando de parada não está sendo executado quando eu executo o comando reboot, embora chamá-lo diretamente funciona bem.

Alguma sugestão sobre o porquê?

Isso está no CentOS 5.2.

    
por DavidM 03.08.2009 / 14:31

2 respostas

1

Geralmente, o arquivo PID é manipulado pelo próprio script de inicialização. Se é o script python que limpa, você deve incluir esse código também ...

Tem certeza de que é o arquivo pid antigo, e não o recém-criado, e que o daemon está travando na inicialização? Recomenda-se que o / tmp seja apagado durante uma inicialização de acordo com o Padrão de Hierarquia do Sistema de Arquivos, consulte esta seção desse documento - não tenho certeza se isso acontece no CentOS ou não, eu achei que sim.

Atualização: O tmpwatch é chamado pelo cron (no dia a dia) e limpa / tmp periodicamente com base no atime (padrão), então realmente você deve colocá-los em / var / run, ou eles podem ser excluídos de você.

Então, eu começaria movendo o arquivo pid para / var / run e colocaria o trabalho de limpá-lo no script de inicialização e partir daí.

    
por 03.08.2009 / 14:44
1

Provavelmente você tem o serviço iniciado corretamente, mas não sendo interrompido corretamente.

Analise o link e garanta que você tenha o (s) script (s) K, assim como os scripts S; talvez seja necessário executar o seguinte (copiado da página acima):

ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc0.d/K15sd-agent
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc1.d/K15sd-agent
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc2.d/K15sd-agent
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc3.d/S85sd-agent
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc4.d/S85sd-agent
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc5.d/S85sd-agent 
ln -s /etc/rc.d/init.d/sd-agent /etc/rc.d/rc6.d/K15sd-agent
    
por 06.11.2010 / 04:41