O script Init.d funciona quando executado manualmente, mas não na reinicialização

1

Estou tentando configurar um servidor RhodeCode no Ubuntu 12.04. Eu tenho tudo instalado em um virtualenv e tudo funciona corretamente quando eu o executo a partir do console ( paster serve production.ini ).

Eu escrevi um script init.d para iniciá-lo na inicialização, mas parece que não funciona. Quando executo sudo /etc/init.d/rhodecode start manualmente, vejo "Iniciando o RhodeCode" ecoado no console e tudo funciona. No entanto, se eu reiniciar, ou se eu usar sudo service rhodecode start , vejo a mensagem ecoada no console, mas os processos do Python não estão em execução.

Eu instalei o script usando update-rc.d rhodecode defaults .

Depois de pesquisar como alcançar isso, as fontes que encontrei sugeriram que eu não precise executar source /usr/rhode/venv se eu executar o python diretamente do diretório virtualenv. Executar com sucesso isso a partir do console sem ativar qualquer virtualenv primeiro parece apoiar esta teoria. A página virtualenv parece confirmar isso :

If you directly run a script or the python interpreter from the virtualenv's bin/ directory (e.g. path/to/env/bin/pip or /path/to/env/bin/python script.py) there's no need for activation.

Para mais detalhes sobre como eu configurei o servidor, esta Gist mostra minhas anotações sobre o que eu fiz até agora: Instalando o RhodeCode 1.3.6 no Ubuntu Server 12.04

/etc/init.d/rhodecode

#!/bin/sh

### BEGIN INIT INFO
# Provides:       rhodecode
# Required-Start: $all
# Required-Stop:  $all
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Short-Description: Starts RhodeCode
### END INIT INFO

USER=rhodeuser

VENV_DIR=/usr/rhode/venv
DATA_DIR=/usr/rhode/data

CELERY_ARGS="$VENV_DIR/bin/paster celeryd $DATA_DIR/production.ini"
RHODECODE_ARGS="$VENV_DIR/bin/paster serve $DATA_DIR/production.ini"

CELERY_PID_FILE=/var/run/celeryd.pid
RHODECODE_PID_FILE=/var/run/rhodecode.pid

start_celery() {
    /sbin/start-stop-daemon \
        --start \
        --background \
        --chuid $USER \
        --pidfile $CELERY_PID_FILE \
        --exec $VENV_DIR/bin/python -- $CELERY_ARGS
}

start_rhodecode() {
    /sbin/start-stop-daemon \
        --start \
        --background \
        --chuid $USER \
        --pidfile $RHODECODE_PID_FILE \
        --exec $VENV_DIR/bin/python -- $RHODECODE_ARGS
}

stop() {
    /sbin/start-stop-daemon \
        --stop \
        --user $USER
}

case "$1" in
    start)
        echo "Starting Celery"
        start_celery
        echo "Starting RhodeCode"
        start_rhodecode
        ;;
    stop)
        echo "Stopping RhodeCode and Celery"
        stop
        ;;
    restart)
        echo "Stopping RhodeCode and Celery"
        stop
        echo "Starting Celery"
        start_celery
        echo "Starting RhodeCode"
        start_rhodecode
        ;;
    *)
        exit 2
        ;;
esac

exit 0
    
por Stephen Jennings 05.06.2012 / 07:35

4 respostas

1

Eu odeio esse tipo de "resposta", mas parece que eu devo ter de alguma forma danificado a instalação sem perceber. Eu removi todo o virtualenv do RhodeCode e recriou-o de acordo com minhas anotações , e agora o script init.d funciona corretamente quando eu chamo via service rhodecode start .

Gostaria de saber o que fiz de errado na primeira vez.

    
por 06.06.2012 / 06:55
1

Já experimentou o script init.d fornecido ?

Acho que --exec $DAEMON -- $DAEMON_OPTS está faltando no seu script.

    
por 05.06.2012 / 07:56
0

Eu acredito que o que você está perdendo é algo para carregar o ambiente virtualenv. Eu me deparo com o mesmo tipo de problemas com o RVM do Ruby, que é semelhante ao virtualenv. De acordo com os documentos, você precisará usar ativar em seu script.

    
por 05.06.2012 / 07:48
0

Você precisa adicionar source $VENV_DIR/bin/activate ao seu script antes de executar os comandos. Quando você está executando como seu próprio usuário, você provavelmente já ativou o ambiente virtual.

    
por 05.06.2012 / 07:55