it-swarm.com.de

Erstellen eines Dienstes in Ubuntu 16.04 für eine Java jsvc-Anwendung

Wie erstelle ich einen Dienst für meine Anwendung Java, auf dem ich ihn mit dem Apache Commons Daemon jsvc ausführen muss? Der Dienst sollte beim Systemstart gestartet werden. Ich habe gesucht und gesucht, gelesen und gelesen und vieles ausprobiert, und nichts scheint zu funktionieren.

Ich habe ein .sh-Skript im Pfad /etc/init.d/ erstellt und führe alle erforderlichen Befehle aus, die im "Web" wie chmod 755 mydaemon.sh und oder chmod +x mydaemon.sh vorgeschlagen wurden. Wenn ich ohne .sh schreibe, funktioniert dies nicht. Daher weiß ich nicht, warum dies vorgeschlagen wird. Aber es sieht so aus, als wäre dies ein alter Ansatz vor Version 15 oder so. Nun, zumindest habe ich festgestellt, dass einige Leute sagen, dass es veraltet ist und dass systemd das neue Schwarz ist.

Ich habe auch versucht, eine mydamon.service-Datei in /etc/systemd/system zu erstellen, die ExecStart und Stop auf mein .sh-Skript verweist. Ich habe alle systemctl daemon-realod -> systemctl start myservice gemacht. Hier ist ein Beispiel meiner .service-Datei

[Unit]
Description=Scheduler Test

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

[Install]
WantedBy=multi-user.target

hier ist ein Beispiel für mein .sh-Skript

#!/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

Aber nichts passiert, wenn ich versuche, es zu starten, derzeit startet und stoppt es sofort. Es sieht so aus, als ob meine Anwendung eine meiner Eigenschaftendateien, auf die ich in der Datei /etc/environment verweise, nicht lesen kann:

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

Die Hauptklasse meiner Bewerbung ist unten zu sehen:

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.");
    }
}

Und wie ich aus der Protokollierung ersehen kann, ist path null.

Seltsamer ist jedoch, dass ich meine "jsvc" -App starten kann, wenn ich zum Beispiel meinen myscheduler.sh in ex setze. /home/john/Downloads/test und starten Sie es manuell wie sh myscheduler.sh start, dann funktioniert es einwandfrei, kann es jedoch nicht als Dienst ausführen und beim Systemstart update-rc.d ....

Ich bin neu in Linux oder zumindest nicht so erfahren. Ich denke, es könnte sich um einen Dateizugriff mit Ordnerberechtigung handeln. Ich würde gerne einfach einen chmod -R 777 vergeben, bin mir jedoch der Konsequenzen und der möglichen Auswirkungen bewusst zu meinem system, habe es ein- oder zweimal vor xD ausprobiert. Läuft Ubuntu 16.04 auf VirtualBox, so erstelle ich nur ein neues Image, wenn es kaputt geht.

2
Yantes

Fand die Lösung, musste EnvironmentFile=/etc/environment und Type=forking Option in meiner .service Datei einstellen, dann funktionierte es gut.

1
Yantes