У меня есть довольно длинный набор аргументов для передачи исполняемому файлу. Я создал простой systemd
unit файл, и он хорошо работает:
[Unit]
Description=My Service
[Service]
WorkingDirectory=/opt/my-service
EnvironmentFile=-/opt/my-service/environment
ExecStart=/usr/bin/java $JAVA_ARGS -jar /opt/my-service/my-service.jar
[Install]
WantedBy=multi-user.target
В /opt/my-service/environment
, У меня есть следующее (просто пример):
JAVA_ARGS=-server -Xms1500m -Xmx1500m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:NewRatio=1 -XX:SurvivorRatio=4 -Djava.io.tmpdir=/opt/my-service/tmp
Я хотел бы иметь возможность разбить эту переменную на несколько, чтобы сделать ее немного более понятной. Что-то такое:
JAVA_TMP_DIR=/opt/my-service/tmp
JAVA_JVM_ARGS=-server -Xms1500m -Xmx1500m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:NewRatio=1 -XX:SurvivorRatio=4
JAVA_ARGS=$JAVA_JVM_ARGS -Djava.io.tmpdir=$JAVA_TMP_DIR
Но когда я использую это, значения $JAVA_JVM_ARGS
и $JAVA_TMP_DIR
не заменяются и печатаются как есть в $JAVA_ARGS
(который правильно заменен):
[root@ip-10-0-1-140 system]# systemctl status my-service
my-service.service - My Service
Loaded: loaded (/etc/systemd/system/my-service.service; enabled)
Active: failed (Result: exit-code) since Thu 2016-01-14 11:01:05 UTC; 3s ago
Process: 28148 ExecStart=/usr/bin/java $JAVA_ARGS -jar /opt/my-service/my-service.jar (code=exited, status=1/FAILURE)
Main PID: 28148 (code=exited, status=1/FAILURE)
Jan 14 11:01:05 ip-10-0-1-140.us-west-1.compute.internal systemd[1]: Started My Service.
Jan 14 11:01:05 ip-10-0-1-140.us-west-1.compute.internal java[28148]: Error: Could not find or load main class $JAVA_JVM_ARGS
Jan 14 11:01:05 ip-10-0-1-140.us-west-1.compute.internal systemd[1]: my-service.service: main process exited, code=exited, status=1/FAILURE
Jan 14 11:01:05 ip-10-0-1-140.us-west-1.compute.internal systemd[1]: Unit my-service.service entered failed state.
Есть ли способ добиться такого поведения с помощью файлов среды?
Редактировать: Просто нашел другое решение:
Если у вас есть это
JAVA_TMP_DIR=/opt/my-service/tmp
JAVA_JVM_ARGS=-server -Xms1500m -Xmx1500m ...
...
тогда вы можете установить ExecStart следующим образом
ExecStart=/usr/bin/java $JAVA_JVM_ARGS -Djava.io.tmpdir=${JAVA_TMP_DIR} -jar /opt/my-service/my-service.jar
(убедитесь, что вторая переменная находится в {})
Ниже моего исходного сообщения, вероятно, также решение для кого-то:
На самом деле кажется, что это не работает, если у вас есть переменная в параметре, например -Djava.io.tmpdir=$JAVA_TMP_DIR
Я бы посоветовал вам так решить вашу проблему. Измените свой EnvironmentFile следующим образом:
JAVA_TMP_DIR='-Djava.io.tmpdir=/opt/my-service/tmp'
Затем вы можете изменить строку запуска файла модуля на это:
ExecStart=/usr/bin/java $JAVA_JVM_ARGS $JAVA_TMP_DIR -jar /opt/my-service/my-service.jar
В моем случае это сработало.