Systemd强制执行目录

Systemd force directory of execution

我有一个 Java 应用程序,我想创建一个系统服务来在启动时执行该 jar。我知道如何为 upstartSysV 做,但我在 systemd 上遇到了麻烦。

困难的部分是我需要从它所在的目录中执行 jar,以便它选择它旁边的 application.properties,以及一些与 jar 位置相关的目录.

例如,假定以下结构:

+-var
   +-myapp
       +-app.jar
       +-app.log
       +-application.properties
       +-certificate.jks
       +-images
           +-img1.jpg

我想执行jar的方式是:

$ cd /var/myapp
$ java -jar app.jar

因此,当我在 myapp 目录中执行 jar 时,它会记录到 app.log,它会选择 application.properties 并读取 certificate.jks。它还可以找到目录 images.

我已经尝试将其作为 systemd

的单元文件
 [Unit]
 Description=App Description
 After=network.target

 [Service]
 Type=simple
 User=sebasira
 WorkingDirectory=/var/myapp
 ExecStart=/usr/bin/java -jar app.jar
 SuccessExitStatus=143
 Restart=on-failure

 [Install]
 WantedBy=multi-user.target   

它运行 jar 文件,但不是从 /var/myapp

中运行

我该如何解决?

制作一个 shell 脚本,如 /var/myapp:

#!/bin/sh
# runMyJar.sh    
java  -Djava.awt.headless=true -jar /var/myapp/app.jar

当然要使其可执行。

然后将其配置为在启动时分叉的服务:

    [Unit]
    Description=My App Jar

    [Service]
    Type=forking
    ExecStart=/var/myapp/runMyJar.sh

    [Install]
    WantedBy=multi-user.target

根据需要添加其他 systemd 选项。

jar 文件应以 /var/myapp 作为默认主目录或工作区目录执行。


编辑(基于@sebasira 评论)

以下 .sh 脚本也可以使用此 systemd 配置:

#!/bin/sh
# runMyJar.sh    
cd /var/myapp/;java -jar app.jar