我使用的是 Debian 8,我需要在我的服务中设置 JAVA_HOME。我把这是一个脚本,所以它需要首先查询系统,因为它并不总是相同的。从命令行中,ExecStart 行工作正常,但当我将其放入此服务中时则不然。我收到:
Aug 12 17:03:16 debian jsvc[6761]: Invalid option -f
Aug 12 17:03:16 debian jsvc[6761]: Cannot parse command line arguments
Aug 12 17:03:16 debian systemd[1]: App1.service: control process exited, code=exited status=1
Aug 12 17:03:16 debian systemd[1]: Failed to start App1.
-- Subject: Unit App1.service has failed
我的服务:
[Unit]
Description=App1
After=syslog.target
[Service]
ExecStart=/usr/bin/jsvc -user root -home ${readlink -f /usr/bin/java | sed "s:bin/java::"} -cp /usr/share/java/commons-daemon.jar:/usr/local/app1.jar -pidfile /var/run/app1 -pidfile
Type=forking
答案1
您的 exec 行将按空格分割,每个单词作为参数传递给命令。对您来说最简单的解决方案是将整个命令用单引号引起来并/bin/bash -c
在其前面添加:
ExecStart=/bin/bash -c 'exec /usr/bin/jsvc -user ... -pidfile'
最初使用-cv
,这样您就可以在日志中看到传递了哪一行。我还假设您$()
不希望${}
systemd 不会扩展。
答案2
您可以在服务文件 [Service] 部分中添加一行:Enviroment="JAVA_HOME=/foo/bar/baz"。
或者,使用类似 EnvironmentFile=/etc/default/myapp 的内容,并在该文件中设置 JAVA_HOME=/baz/quux