Gravando um arquivo de unidade systemd com um caminho do executável do conjunto de ambientes

16

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 iniciar, recebo um erro

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á corretamente definido; se eu alterar a linha ExecStart para começar com /usr/bin/java e, em seguida, adicionar algo como -DsomeOption=${JAVA_HOME} , posso vê-la bem.

A solução óbvia é criar um script de wrapper, mas sinto que ele vence o ponto de usar um arquivo de serviço.

Como posso definir o JAVA_HOME para meu aplicativo Java usando um arquivo de unidade?

    
por Robert Munteanu 28.04.2015 / 11:50

2 respostas

12

Na seção "Linhas de comando" em systemd.service (5):

Note that the first argument (i.e. the program to execute) may not be a variable.

Eu sugeriria usar o especificador de instância %i (você pode ler mais sobre isso em systemd.unit (5)), mas (agora estamos de volta em systemd.service (5)):

the first argument of the command line (i.e. the program to execute) may not include specifiers.

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ê poderia executar ExecStart diretamente como no exemplo para linhas de comando shell nas "Linhas de Comando". "seção de systemd.service (5) que tem o seguinte exemplo:

ExecStart=/bin/sh -c 'dmesg | tac'

para que você possa fazer (não testado):

ExecStart=/bin/sh -c '${JAVA_HOME}....'
    
por 29.04.2015 / 10:06
2

Outra opção semelhante é usar /usr/bin/env :

ExecStart=/usr/bin/env "${JAVA_HOME}/bin/java" -jar ...

Dessa forma, você pode omitir ' aspas em todo o comando, o que é útil se você precisar aninhar as citações.

PS. Como observação, é importante incluir nomes de variáveis em { chaves } em arquivos Systemd, caso contrário eles não serão reconhecidos corretamente.

    
por 18.10.2017 / 21:26

Tags