J'écris un fichier d'unité systemd pour une application Java et je voudrais contrôler la version de Java utilisée pour le démarrer. Mon fichier de service (simplifié) est
[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
Lorsque j'essaie de le démarrer, je reçois une erreur
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.
Je sais que JAVA_HOME
c'est correctement réglé; si je change la ExecStart
ligne pour commencer /usr/bin/java
et que j'ajoute quelque chose comme -DsomeOption=${JAVA_HOME}
je peux le voir très bien.
La solution de contournement évidente consiste à créer un script wrapper, mais je pense qu'il va à l'encontre de l'utilisation d'un fichier de service.
Comment puis-je définir JAVA_HOME pour mon application Java à l'aide d'un fichier d'unité?
Réponses:
Dans la section "Lignes de commande" de systemd.service (5):
J'allais suggérer d'utiliser le spécificateur d'instance
%i
(vous pouvez en savoir plus à ce sujet dans systemd.unit (5)), mais (maintenant nous sommes de retour dans systemd.service (5)):Je pense que la meilleure option à ce stade est vraiment de créer un script shell qui encapsule l'exécution du binaire java comme suggéré par Warren Young ou vous pouvez exécuter ExecStart un shell directement comme dans l'exemple des lignes de commande du shell dans la section "Lignes de commande" de systemd.service (5) qui a l'exemple suivant:
afin que vous puissiez faire (non testé):
la source
Une autre option similaire consiste à utiliser
/usr/bin/env
:De cette façon, vous pouvez omettre
'
guillemets autour de la commande entière, ce qui est utile si vous avez besoin d'imbriquer des choses entre guillemets.PS. En remarque, il est important de placer les noms de variables entre
{
accolades}
dans les fichiers Systemd, sinon ils ne seront pas reconnus correctement.la source