在 Ubuntu 16.04 中为 Java jsvc 应用程序创建服务

在 Ubuntu 16.04 中为 Java jsvc 应用程序创建服务

如何为我的 Java 应用程序创建一个服务,以便使用 apache commons daemon jsvc 来运行它。该服务应在系统启动时启动。我搜索了又搜索,阅读了又阅读,尝试了很多东西,但似乎都不起作用。

我在路径中创建了一个 .sh 脚本/etc/init.d/,并运行了“web”建议的所有必要命令,例如chmod 755 mydaemon.sh和 或chmod +x mydaemon.sh,如果不输入 则不起作用.sh,所以我不知道为什么人们会建议这样做。但看起来这可能是 v.15 之前的老方法。好吧,至少我发现有些人说它已被弃用,而 systemd 才是新的黑科技。

我还尝试创建一个 mydamon.service 文件,将/etc/systemd/systemExecStart 和 Stop 指向我的 .sh 脚本。我已完成所有systemctl daemon-realod-> 。这是我的文件systemctl start myservice示例.service

[Unit]
Description=Scheduler Test

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

[Install]
WantedBy=multi-user.target

这是我的.sh脚本的一个例子

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

但是当我尝试启动它时什么也没有发生,目前它立即启动并停止。看起来我的应用程序无法读取我在文件中指向的属性文件之一/etc/environment

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

我的应用程序的主要类别如下所示:

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

而且我从日志中看到它path是空的。

但更奇怪的是,如果我将我的应用程序放在myscheduler.shex 中/home/john/Downloads/test并手动启动它,我就可以启动我的“jsvc”应用程序sh myscheduler.sh start,这样它就可以正常工作,但似乎无法使其作为服务并在系统启动时运行update-rc.d ...

我是 Linux 新手,或者至少经验不是很多,我认为这可能是某些文件夹权限访问,我很乐意将其全部授予,chmod -R 777但我很清楚后果以及它会对我的系统造成什么影响,之前尝试过一次或两次 xD。在 VirtualBox 上运行 Ubuntu 16.04,因此如果它坏了,我只需创建一个新映像。

答案1

找到了解决方案,必须在我的文件中设置EnvironmentFile=/etc/environmentType=forking选项,.service然后它就可以正常工作。

相关内容