【问题标题】:Systemd force directory of executionSystemd 强制执行目录
【发布时间】:2020-10-02 18:10:29
【问题描述】:

我有一个 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

所以当我在执行 jar 时位于 myapp 目录中时,它会记录到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 内部运行

我该如何解决?

【问题讨论】:

标签: java spring-boot service systemd


【解决方案1】:

制作一个类似于 /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

【讨论】:

  • 嗨!谢谢!对不起,我还没试过,给几个小时
  • 谢谢!在您的指导下,我设法使它工作。我只是将脚本从 runMyJar.sh 更改为 cd /var/myapp/;java -jar app.jar
猜你喜欢
  • 2016-03-13
  • 2017-07-21
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多