我正在为Java应用程序编写一个systemd单元文件,我想控制用于启动它的Java版本。我的(简化的)服务文件是
[Service]
Type=simple
EnvironmentFile=%h/Documents/apps/app/app-%i/app.cfg
ExecStart=${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar %h/Documents/apps/app/app-%i/myapp.jar
SuccessExitStatus=143
尝试启动时,我收到错误提示
Apr 28 12:43:37 rombert systemd[1613]: [/home/robert/.config/systemd/user/[email protected]:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: [email protected] lacks both ExecStart= and ExecStop= setting. Refusing.
我知道这JAVA_HOME
是正确的; 如果我将ExecStart
行更改为开头,/usr/bin/java
然后添加一些内容,就像-DsomeOption=${JAVA_HOME}
我看到的一样。
显而易见的解决方法是创建一个包装器脚本,但是我觉得它超出了使用服务文件的目的。
如何使用单元文件为Java应用程序设置JAVA_HOME?
在systemd.service(5)的“命令行”部分中:
请注意,第一个参数(即要执行的程序)可能不是变量。
我本来建议使用实例说明符%i
(您可以在systemd.unit(5)中阅读有关它的更多信息),但是(现在我们回到systemd.service(5)):
命令行的第一个参数(即要执行的程序)可能不包含说明符。
我认为目前最好的选择是按照Warren Young的建议创建一个封装Java二进制代码执行的shell脚本,或者您可以像下面的“命令行”部分中的shell命令行示例一样直接执行ExecStart shell。 systemd.service(5)具有以下示例:
ExecStart=/bin/sh -c 'dmesg | tac'
因此,您可以(未试用)进行以下操作:
ExecStart=/bin/sh -c '${JAVA_HOME}....'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句