首页 > 解决方案 > Systemd 强制执行目录

问题描述

我有一个 Java 应用程序,我想创建一个系统服务来在启动时执行该 jar。我知道如何为新贵SysV做这件事,但我在使用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

因此,当我在执行 jar 时位于myappapp.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

我该如何解决?

标签: javaspring-bootservicesystemd

解决方案


在 /var/myapp 中创建一个 shell 脚本:

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

推荐阅读