Como investigar a inicialização do runlevel?

1

Estou investigando por que um serviço (solr) não é iniciado na inicialização do servidor (neste caso, uma caixa vagrant, executando o Ubuntu 12.04).

O script está sendo executado se eu executar /etc/init.d/solr start

Eu executo os padrões sudo update-rc.d solr Mas não está sendo executado após a inicialização e agora eu não sei como investigar.

Quais são minhas opções de depuração?

O script:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          solr
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts solr
# Description:       Starts solr using start-stop-daemon
### END INIT INFO

SOLR_HOME=/vagrant/solr/jetty
DAEMON=/usr/bin/java
DAEMON_OPTS='-jar start.jar'
NAME=Solr
DESC=Solr
PID_FILE=/vagrant/solr/jetty/$NAME.pid
SOLR_USER=vagrant
SOLR_GROUP=vagrant

test -x $DAEMON || exit 1

set -e

. /lib/lsb/init-functions

case "$1" in
  start)
    echo -n "Starting $DESC: "
    if start-stop-daemon -d $SOLR_HOME --start -b -m --pidfile $PID_FILE --user $SOLR_USER --group $SOLR_GROUP --chuid $SOLR_USER --startas $DAEMON -- $DAEMON_OPTS
    then
        echo "solr started" >> /var/log/messages
        exit 0
    else
    echo "solr start failed" >> /var/log/messages
        exit 1
    fi
    ;;
  stop)
    echo -n "Stopping $DESC: "
    if start-stop-daemon --stop --pidfile $PID_FILE
    then
        echo "stopped."
        exit 0
    else
        echo "failed."
        exit 1
    fi
    ;;
  restart|force-reload)
    ${0} stop
    sleep 0.5
    ${0} start
    ;;
  status)
    status_of_proc -p $PID_FILE "$DAEMON" solr && exit 0 || exit $?
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|force-reload}" >&2
    exit 1
    ;;
esac

exit 0

A saída em / var / log / messages é (duas vezes!) solr started ...

    
por shredding 19.03.2014 / 16:48

2 respostas

0

Existem algumas maneiras de resolver esse problema, mas, creio eu, todas elas se resumem à mesma coisa.

A maneira "Crude / Bare metal" de fazer isto - Dê uma olhada em / etc (idealmente como root), e você encontrará um número de diretórios rcX.d assim como um diretório "init.d". / p>

Se você olhar em um dos diretórios rcX.d, verá que ele está cheio de arquivos que são ligados simbolicamente a /etc/init.d/filename. O "S" no início do arquivo significa "start". O número que vem a seguir indica que os arquivos de pedidos devem ser executados.

Quando o sistema operacional inicia / altera o nível de execução, ele executa todo o arquivo para esse nível de execução, ou seja, para o nível de execução 2 será executado /etc/rc2.d/S* - Se o arquivo não estiver linkado, não será iniciado quando o nível de execução é iniciado. Para verificar o nível de execução atual, você pode digitar "runlevel", que retornará o nível de execução atualmente em execução.

Você provavelmente está interessado nos runlevels 2-5 - você pode encontrar uma lista dos runlevels aqui

Se você quiser adicionar um programa ao nível de execução apropriado, basta criar o link simbólico apropriado. A maneira que eu prefiro fazê-lo, porém, é instalar o "chkconfig". Eu não sei se isso é uma versão do script Redhat (sintaxe não é compatível, mas muito perto) - mas esse comando permitirá que você visualize e altere quais programas funcionam em runlevels.

chkconfig -l Irá mostrar todos os programas e seus runlevels, e chkconfig -l progname mostrará runlevels habilitados para um determinado programa.

Para fazer um programa rodar em um runlevel em particular (ou múltiplos runlevels) você pode usar o chkconfig progname Runlevels, ex. chkconfig sshd 2345 irá garantir que o sshd rode quando você entrar no nível de execução 2,3,4 ou 5.

    
por 28.03.2014 / 07:50
0

O problema é que, no momento em que os scripts init.d são iniciados, /vagrant/ não está disponível / montado, mas você depende que ele esteja lá em seu script.

Veja link para alguns indicadores.

    
por 07.07.2014 / 20:02