
Wenn ich den folgenden Teil in einem Bash-Skript ausführe, funktioniert es:
/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
Wenn ich es jedoch leicht ändere, um es als Teil eines systemd-Dienstes zu verwenden:
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
Es zeigt mir:
● 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 '='.
Was ist die richtige Syntax dafür? Ich war so sicher, dass einfaches Bash hier funktionieren müsste.
PS: Ich habe gerade bemerkt, dass es funktioniert, wenn ich alles in eine Zeile setze. Es wäre jedoch toll zu wissen, wie man alles auf mehreren Zeilen unterbringen kann.
Antwort1
Ich war so sicher, dass ein einfaches Bash hier funktionieren müsste.
bash ist kein allgemeiner Begriff für Shell-Skripte, und der Wert der ExecStart
Einstellung einer Service-Unit istkein Shell-Skriptüberhaupt, geschweige dennBourne Again-ShellSkript. Viele Leute dachten im Laufe der Jahre, sie könnten hier Shell-Skripte einfügen, die aus tatsächlichen Shell-Skripten oder Shell-Befehlszeileneingaben transponiert wurden. Das hat dazu geführt, dass das systemd-Handbuch diesbezüglich schließlich recht explizit ist. Siehe den Abschnitt „Befehlszeilen“ von man systemd.service
.
Im Handbuch steht nur, dass einnachlaufendBackslash verbindet Zeilen. Ein Backslash mit Leerzeichen (CR, SPC usw.) zwischen ihm und dem Zeilenende ist (natürlich) kein abschließender Backslash. Somit werden alle nachfolgenden Zeilen zu (fehlerhaften oder ungültigen) weiteren Schlüssel+Wert-Einstellungen.
Lesen Sie das systemd.service
Handbuch und machen Sie sich mit den Regeln vertraut, die Sie hier tatsächlich verwenden. Es handelt sich nicht um ein Shell-Skript, und Sie sollten nicht davon ausgehen, dass es eines ist und Sie es einfach so behandeln können, auch wenn dieser Ansatz von Zeit zu Zeit erfolgreich ist.