当我在 bash 脚本中运行以下部分时,它会起作用:
/usr/bin/java \
-Dspring.index.ignore=true \
--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
--add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
--illegal-access=permit \
-jar /home/x/my.jar \
--spring.config.additional-location=/home/x/config.yml
但是,如果我稍微修改它以将其用作 systemd 服务的一部分:
ExecStart=/usr/bin/java \
-Dspring.index.ignore=true \
--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED \
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED \
--add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED \
--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED \
--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED \
--illegal-access=permit \
-jar /home/x/my.jar \
--spring.config.additional-location=/home/x/config.yml
它向我展示:
● my.service - my
Loaded: error (Reason: Invalid argument)
Active: inactive (dead)
Unknown lvalue '--illegal-access' in section 'Service'
Missing '='.
Ignoring unknown escape sequences: "\"
Unknown lvalue '--add-exports' in section 'Service'
Unknown lvalue '--add-exports' in section 'Service'
Unknown lvalue '--add-exports' in section 'Service'
Unknown lvalue '--add-exports' in section 'Service'
Unknown lvalue '--add-exports' in section 'Service'
Unknown lvalue '--illegal-access' in section 'Service'
Missing '='.
正确的语法是什么?我确信简单的 bash 应该可以在这里工作。
PS刚刚注意到,如果我将所有内容都放在一行中,它就会起作用。然而,如果知道如何将所有内容保持在多行上,那就太好了。
答案1
我确信简单的 bash 应该可以在这里工作。
bash不是shell脚本的总称,ExecStart
服务单元的设置值为不是 shell 脚本一点也不,更不用说谍影重重 shell脚本。多年来,许多人认为他们可以将 shell 脚本放在这里,从实际的 shell 脚本或 shell 命令行输入转换而来,导致 systemd 手册最终对此非常明确。请参阅 的“命令行”部分man systemd.service
。
该手册仅指出尾随反斜杠合并行。与行尾之间带有空白字符(CR、SPC 等)的反斜杠(当然)不是尾随斜杠。因此,所有后续行都成为(格式错误或无效)进一步的键+值设置。
阅读systemd.service
手册并了解您实际使用的规则。它不是 shell 脚本,您不应该假设它是 shell 脚本,并且您可以这样对待它,即使这种方法有时很幸运。