我正在为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/app@.service:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: app@1.0.0.service lacks both ExecStart= and ExecStop= setting. Refusing.
我知道JAVA_HOME设置正确;如果我将ExecStart行更改为以/usr/bin/java开头,然后添加类似-DsomeOption = ${JAVA_HOME}的内容,我可以看到它就好了.
显而易见的解决方法是创建一个包装器脚本,但我觉得它无法使用服务文件.
如何使用单元文件为我的Java应用程序设置JAVA_HOME?
解决方法:
从systemd.service(5)中的“命令行”部分:
Note that the first argument (i.e. the program to execute) may not be a variable.
我打算建议使用实例说明符%i(你可以在systemd.unit(5)中阅读更多关于它的信息),但是(现在我们回到systemd.service(5)):
the first argument of the command line (i.e. the program to execute) may not include specifiers.
我认为此时最好的选择是创建一个shell脚本,它包含Warren Young建议的java二进制文件的执行,或者你可以直接执行一个shell,就像在“命令行”部分的shell命令行示例中一样. systemd.service(5),它有以下例子:
ExecStart=/bin/sh -c 'dmesg | tac'
所以你可以做(未经测试):
ExecStart=/bin/sh -c '${JAVA_HOME}....'
原文地址:https://codeday.me/bug/20190808/1626161.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。