저는 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
실행 줄은 공백으로 구분되며 각 단어는 명령에 대한 인수로 전달됩니다. 가장 쉬운 해결책은 전체 명령을 작은따옴표로 묶고 /bin/bash -c
명령 앞에 다음을 추가하는 것입니다.
ExecStart=/bin/bash -c 'exec /usr/bin/jsvc -user ... -pidfile'
처음에 사용하면 -cv
어떤 줄이 전달되었는지 로그에서 확인할 수 있습니다. 또한 systemd가 확장되지 않는 것을 $()
원하지 않는다고 가정합니다 .${}
답변2
서비스 파일의 [Service] 섹션에 Environment="JAVA_HOME=/foo/bar/baz" 줄을 추가할 수 있습니다.
또는 EnvironmentFile=/etc/default/myapp과 같은 것을 사용하고 해당 파일에 JAVA_HOME=/baz/quux를 설정하십시오.