java - 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
我该如何解决?
解决方案
在 /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
推荐阅读
- vue.js - Vuetify 2 - 组件类型的动态绑定
- python - 如何使用散景HexTile在x,y图上倾斜六边形瓷砖
- python - 如何在python中计算图像上的红色和黄色多边形?
- google-maps - 谷歌地图 - SVG 标记问题
- xml - 字符串中的子字符串匹配
- c# - 哪种方式对异步更有效/更快
- sqlite - 为什么以下查询不会生成最受欢迎公寓的 ID 和地址?
- python-3.x - 我如何让这个按钮接受输入并使用它
- azure - Azure - 如何确认 NIC 配置正确?
- opencv - 如何使用来自 tensorflow 对象检测 api 的检测到的对象使用 mobilenet 进行对象跟踪?