Estou escrevendo um arquivo de unidade systemd para um aplicativo Java e gostaria de controlar a versão do Java usada para iniciá-lo. Meu arquivo de serviço (simplificado) é
[Service]
Type=simple
EnvironmentFile=%h/Documents/apps/app/app-%i/app.cfg
ExecStart=${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar %h/Documents/apps/app/app-%i/myapp.jar
SuccessExitStatus=143
Ao tentar iniciá-lo, recebo um erro de volta
Apr 28 12:43:37 rombert systemd[1613]: [/home/robert/.config/systemd/user/[email protected]:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: [email protected] lacks both ExecStart= and ExecStop= setting. Refusing.
Eu sei que JAVA_HOME
está definido corretamente; se eu mudar a ExecStart
linha para começar /usr/bin/java
e depois adicionar algo como -DsomeOption=${JAVA_HOME}
eu posso ver bem.
A solução óbvia é criar um script de wrapper, mas acho que isso acaba com o ponto de usar um arquivo de serviço.
Como posso definir JAVA_HOME para meu aplicativo Java usando um arquivo de unidade?
Respostas:
Na seção "Linhas de comando" no systemd.service (5):
Eu sugeriria o uso do especificador de instância
%i
(você pode ler mais sobre isso em systemd.unit (5)), mas (agora estamos de volta em systemd.service (5)):Eu acho que a melhor opção neste momento é realmente criar um script de shell que envolva a execução do binário java, como sugerido por Warren Young, ou você pode executar um shell diretamente como no exemplo das linhas de comando do shell na seção "Command Lines" systemd.service (5), que possui o seguinte exemplo:
para que você possa fazer (não testado):
fonte
Outra opção semelhante é usar
/usr/bin/env
:Dessa forma, você pode omitir
'
aspas em todo o comando, o que é útil se você precisar aninhar itens entre aspas.PS. Como uma observação lateral, é importante colocar nomes de variáveis entre
{
chaves}
nos arquivos Systemd, caso contrário eles não serão reconhecidos corretamente.fonte