我有一个相当长的parameter passing给一个可执行文件。 我创build了一个简单的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
我希望能够把这个variables分解成几个,使其更容易理解。 类似的东西:
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的值不会被replace,而是按$JAVA_ARGS打印在$JAVA_ARGS (即被正确replace):
[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.
有没有办法使用环境文件来实现这种行为?
编辑:刚发现一个不同的解决scheme:
如果你有这个
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
(确保第二个variables在{}中)
在我原来的post下面,可能也是某个人的解决scheme:
其实它似乎不工作,如果你有一个参数内的variables,如-Djava.io.tmpdir=$JAVA_TMP_DIR
我build议你解决你的问题。 像这样改变你的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
这在我的情况下工作。