Estou instalando o SonarQube Community Build no Ubuntu. Eu instalei o Java de um .tar.gz para /opt/java. Eu adicionei JAVA_HOME=/opt/java/
e SONAR_JAVA_PATH=/opt/java/bin/java
ao meu arquivo .profile. echo $JAVA_HOME
e echo $SONAR_JAVA_PATH
me deu os resultados esperados.
Instalei o SonarQube em /opt/sonarqube e posso iniciá-lo usando /opt/sonarqube/bin/linux-x86-x64/sonar.sh start
.
O que ainda não está funcionando é instalá-lo como um serviço systemd. Os logs mostram
Java not found. Please make sure that the environmental variable SONAR_JAVA_PATH points to a Java executable
Este é o arquivo da unidade:
[Unit]
Description=SonarQube Community Build
[Service]
Type=simple
RestartSec=1
User=me
ExecStart=/bin/bash /opt/sonarqube/bin/linux-x86-64/sonar.sh start
WorkingDirectory=/opt/sonarqube
[Install]
WantedBy=multi-user.target
O que estou esquecendo? Obrigado.
Acabei de descobrir sobre a tag Environment em arquivos de unidade:
Variáveis de ambiente necessárias para aquele serviço específico devem ser especificadas como parte do serviço, neste caso como
[Service]
Environment=
parâmetros.A causa original é que ele
~/.profile
não será carregado como parte da troca de usuário em geral. 1 Ele é carregado especificamente apenas pelo seu shell (Bash) e somente quando é iniciado no modo "login shell".Mas quando você inicia um serviço, o programa ExecStart não é executado por meio de um shell de "login" – ele não é executado por meio de um shell, apenas executado diretamente – então nenhuma personalização específica do shell se aplica, nem ~/.profile nem ~/.bashrc.
E mesmo que seu ExecStart execute explicitamente um script de shell, esse processo interpretador de script sabe que é um shell não interativo e não carrega nenhum script "rc" ou "profile"; ele
sonar.sh
se comporta como um programa normal e tem apenas o ambiente que herda.Em casos raros, você pode
bash -l -c "..."
forçá-lo a executar como um shell de "login", mesmo que não seja interativo, e, portanto, carregar o ambiente do .profile, mas isso não é necessariamente uma boa ideia, a menos que você saiba que o .profile é bem escrito e não iniciará coisas aleatórias de "iniciar no login".1 (E, por falar nisso, User= também não constitui um "login" completo; ele apenas troca o UID/GID e talvez defina um ambiente "mínimo" como HOME. Os serviços geralmente não precisam passar pelo processo de login completo de qualquer maneira. Para os casos raros, PAMName= pode habilitá-lo, mas isso é apenas as etapas "pré-shell" e ainda não inclui o Bash em si. Em outras palavras, o login do usuário no Linux consiste em muitas etapas discretas, quase todas omitidas para serviços.)