Criando um serviço no Ubuntu 16.04 para um aplicativo java jsvc

2

Como faço para criar um serviço para o meu aplicativo java, onde eu tenho que executá-lo com o daemon apache commons jsvc. O serviço deve ser iniciado na inicialização do sistema. Eu procurei e pesquisei, li e li e tentei muitas coisas, e nada parece funcionar.

Eu criei um script .sh no caminho /etc/init.d/ e executei todos os comandos necessários que a "web" sugeriu como chmod 755 mydaemon.sh e ou chmod +x mydaemon.sh , não funciona quando digitado sem o .sh , então Eu não sei porque as pessoas sugerem isso. Mas parece que isso pode ser uma abordagem antiga antes da v.15. Bem, pelo menos eu descobri que algumas pessoas dizem que ele está obsoleto e que systemd é o novo preto.

Eu também tentei criar um arquivo mydamon.service em /etc/systemd/system apontando o script ExecStart e Stop to my .sh. Eu fiz todo o systemctl daemon-realod - > %código%. Aqui está um exemplo do meu arquivo systemctl start myservice

[Unit]
Description=Scheduler Test

[Service]
ExecStart=/etc/init.d/myscheduler.sh start
ExecStop=/etc/init.d/myscheduler.sh stop

[Install]
WantedBy=multi-user.target

aqui está um exemplo do meu script .service

#!/bin/sh

### BEGIN INIT INFO
#
# Provides: myscheduler
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start the myscheduler service
# Description: This file is used to start the daemon and should be placed in /etc/init.d
### END INIT INFO

NAME="myscheduler"
DESC="MyScheduler service"
EXEC=/usr/bin/jsvc
FILE_PATH="/usr/local/$NAME"
#JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
CLASS_PATH="$FILE_PATH/lib/commons-daemon-1.0.15.jar":"$FILE_PATH/myscheduler.jar"
CLASS="com.example.ApiApplication"
USER="root"
PID=$FILE_PATH/example.pid
LOG_OUT=$FILE_PATH/example.out
LOG_ERR=$FILE_PATH/example.err

jsvc_exec()
{
        cd $FILE_PATH
        $EXEC -home $JAVA_HOME -cp $CLASS_PATH -user $USER -outfile $LOG_OUT -errfile $LOG_ERR -pidfile $PID $1 $CLASS
}

case "$1" in
        start)
                echo "Starting the $DESC..."
                jsvc_exec
                echo "The $DESC has started."
                  ;;
        stop)
                echo "Stopping the $DESC..."
                jsvc_exec "-stop"
                echo "The $DESC has stopped."
                  ;;
        restart)
                if [ -f "$PID" ]; then
                        echo "Restarting the $DESC..."
                        jsvc_exec "-stop"
                        jsvc_exec
                        echo "The $DESC has restarted."
                else
                        echo "Service $DESC not running, no action taken."
                        exit 1
                fi
                        ;;
        *)
                echo "usage: daemon {start|stop|restart}" >&2
                exit 3
                ;;
esac

Mas nada acontece quando tento iniciá-lo, atualmente ele inicia e pára imediatamente. Parece que meu aplicativo não pode ler um dos meus arquivos de propriedades para o qual estou apontando no arquivo .sh :

quartzconfig="/usr/local/myscheduler/quartz.properties"

A classe principal da minha inscrição pode ser vista abaixo:

public class ApiApplication implements Daemon{

    private static Scheduler scheduler;

    public static void main(String[] args) {
        try {
            String path = System.getenv("quartzconfig");
            System.out.println(path);
            Properties props = new Properties();

            Parameters parameters = new Parameters();
            FileBasedConfigurationBuilder<FileBasedConfiguration> builder = new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class)
                    .configure(parameters.properties().setFileName(path));

            Configuration config = builder.getConfiguration();
            props = ConfigurationConverter.getProperties(config);

            SchedulerFactory sf = new StdSchedulerFactory(props);
            scheduler = sf.getScheduler();

            scheduler.start();
        } catch (SchedulerException se){
            se.printStackTrace();
        } catch(ConfigurationException ioe){
            ioe.printStackTrace();
            System.err.println("Could not load properties... something went wrong!");
        }
    }

    @Override
    public void init(DaemonContext daemonContext) throws DaemonInitException, Exception {
        System.out.println("initializing...");
    }

    @Override
    public void start() throws Exception {
        System.out.println("starting...");
        main(null);
    }

    @Override
    public void stop() throws Exception {
        System.out.println("stopping...");
        // if process is stopped gracefully shutdown the scheduler
        scheduler.shutdown();
    }

    @Override
    public void destroy() {
        System.out.println("done.");
    }
}

E como eu posso ver no log /etc/environment é nulo.

Mas o que é mais estranho é que eu posso iniciar meu aplicativo "jsvc" se eu forexemplo colocar meu path no ex. myscheduler.sh e inicie manualmente como /home/john/Downloads/test , então funciona bem, mas parece que não consegue funcionar como um serviço e na inicialização do sistema sh myscheduler.sh start .

Eu sou novo no Linux, ou pelo menos não tão bem experiente, estou pensando que pode ser algum acesso de permissão de pasta de arquivo, eu adoraria apenas dar tudo um update-rc.d ... , mas estou bem ciente das consequências e o que ele poderia fazer no meu sistema, tentei uma ou duas vezes antes do xD. Rodando o Ubuntu 16.04 no VirtualBox, basta criar uma nova imagem se ela quebrar.

    
por Yantes 15.03.2017 / 08:35

1 resposta

1

Encontrei a solução, tive que definir a opção EnvironmentFile=/etc/environment e Type=forking no meu arquivo .service , então funcionou bem.

    
por Yantes 15.03.2017 / 14:13