Iniciando processos Java com o Upstart

6

Eu quero iniciar um processo java usando o Upstart. Atualmente, em nossos servidores OpenSuSE, eu uso o sistema init do System V para conseguir isso, mas em nossos servidores Ubuntu eu prefiro usar o Upstart. Mas eu tenho duas perguntas ...

Eu tenho um trabalho Upstart (uma tarefa) que configura o servidor, chamado, digamos, myconfig. E no trabalho que inicia meus processos de java, eu ostensivamente tenho:

start on stopped myconfig
exec /path/to/myjavastartscript.sh

myjavastartscript.sh executa 'java -classpath blah MyClass'. No init do System V, iniciar o serviço é executado 'nohup /path/to/myjavastartscript.sh & amp;'.

Então, minha primeira pergunta é se eu ainda preciso fazer o nohup ou executar em segundo plano com o comando exec?

Quando em execução, o MyClass inicia outros processos Java. No init do System V, a parada de serviço procura apenas os processos Java pertencentes a um determinado usuário e os mata. Minha segunda pergunta é como eu poderia controlar o término desses processos com o Upstart?

    
por user265330 12.07.2012 / 13:38

2 respostas

4

Você não precisa usar nohup desde quando o Upstart executa um programa, esse processo não será associado a um terminal (por padrão).

Para o Upstart, sugiro que você tenha apenas a ligação do trabalho:

exec java -classpath blah MyClass

... ou garantindo que /path/to/myjavastartscript.sh ligue:

exec java -classpath blah MyClass

Observe que o primeiro exec acima é uma sub-rotina Upstart, enquanto o segundo é uma palavra-chave do shell. Se o seu script de shell não chamar a versão do shell de exec , você precisará ter cuidado para garantir que você defina a sub-rotina Upstart expect corretamente - veja .

Em relação à interrupção do serviço, o Upstart automaticamente mata o processo que está rastreando (o processo principal da JVM associado a MyClass ) e quaisquer filhos desse processo (tecnicamente qualquer processo no mesmo grupo de processos (ver link ).

Sem mais detalhes, não tenho certeza se sua condição start on é adequada - presumivelmente, você deseja que o trabalho do MyClass seja iniciado se, e somente se, um arquivo de configuração tiver sido configurado? Nesse caso, o idioma padrão é que as tarefas pre-start stanza leiam em /etc/default/MyClass.conf . Se ele decidir que o arquivo não existe ou o arquivo de configuração de alguma forma indica que o serviço está desabilitado / não está configurado corretamente, o pre-start pode simplesmente chamar stop para interromper o trabalho de (totalmente) iniciar (consulte < href="http://upstart.ubuntu.com/cookbook/#pre-start"> link . A vantagem dessa abordagem é que sua condição start on pode ser configurada com segurança para qualquer conjunto de condições que deve fazer com que a tarefa seja iniciada. Quando essas condições forem atendidas, o Upstart executará o trabalho; o pré-início será executado, determine que a configuração ainda não é válida e simplesmente saia. No dia em que o administrador decidir configurar o serviço, o trabalho será iniciado totalmente.

Veja o link e link para determinar a condição start on .

Note finalmente que você deve sempre especificar uma condição stop on também. Veja o link .

    
por jamesodhunt 16.07.2012 / 18:27
3

Eu tive o mesmo problema, querendo iniciar o servidor serviio dlna ao inicializar minha máquina.

Este é o meu /etc/init/serviio.conf :

description "Start serviio DLNA server"
author "aanno"

start on net-device-up IFACE=eth0
stop on runlevel [!2345]
env enabled=1

setuid tpasch
setgid tpasch

#respawn the process if it crashes
respawn

env SERVIIO_HOME=/home/tpasch/serviio-1.0.1
script
        [ "$enabled" = "1" ] || [ "$force_start" = "1" ] || exit 0
        # Setup Serviio specific properties
        JAVA_OPTS="-Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dderby.system.home=$SERVIIO_HOME/library -Dserviio.home=$SERVIIO_HOME -Xmx512M -Xms20M -XX:+UseParNewGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20"

        # construct classpath
        cd $SERVIIO_HOME
        CLASSPATH="config"

        for i in lib/*.jar; do
                CLASSPATH="$CLASSPATH:$i"
        done

        exec /usr/bin/java $JAVA_OPTS -classpath $CLASSPATH org.serviio.MediaServer
end script
    
por aanno 04.05.2013 / 09:04

Tags