![在 systemd 单元文件中的同一个 EnvironmentFile 中声明的另一个变量中使用该变量](https://linux22.com/image/674885/%E5%9C%A8%20systemd%20%E5%8D%95%E5%85%83%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%90%8C%E4%B8%80%E4%B8%AA%20EnvironmentFile%20%E4%B8%AD%E5%A3%B0%E6%98%8E%E7%9A%84%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%8F%98%E9%87%8F%E4%B8%AD%E4%BD%BF%E7%94%A8%E8%AF%A5%E5%8F%98%E9%87%8F.png)
我有一组相当长的参数要传递给可执行文件。我创建了一个简单的systemd
单元文件,它运行良好:
[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.
有没有办法使用环境文件实现这种行为?
答案1
编辑:刚刚找到了一个不同的解决方案:
如果你有这个
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
就我而言,这是有效的。