我正在 Ubuntu 上安装 SonarQube Community Build。我已将 Java 从 .tar.gz 安装到 /opt/java。我已将JAVA_HOME=/opt/java/
和添加SONAR_JAVA_PATH=/opt/java/bin/java
到我的 .profile 文件中。echo $JAVA_HOME
并echo $SONAR_JAVA_PATH
给了我预期的结果。
我已将 SonarQube 安装到 /opt/sonarqube,并且可以使用 启动它/opt/sonarqube/bin/linux-x86-x64/sonar.sh start
。
仍然不起作用的是将其安装为 systemd 服务。日志显示
Java not found. Please make sure that the environmental variable SONAR_JAVA_PATH points to a Java executable
这是单元文件:
[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
我遗漏了什么?谢谢。
刚刚发现单元文件中的环境标签:
该特定服务所需的环境变量应作为服务的一部分指定,在本例中为
[Service]
Environment=
参数。最初的原因是它通常
~/.profile
不会作为用户切换的一部分被加载。1它仅由您的 shell(Bash)专门加载,并且仅在以“登录 shell”模式启动时加载。但是当您启动服务时,ExecStart 程序不会通过“登录”shell 运行 - 它根本不通过 shell 运行,只是直接执行 - 因此任何特定于 shell 的自定义都不适用,无论是 ~/.profile 还是 ~/.bashrc。
即使您的 ExecStart 明确运行了 shell 脚本,该脚本解释器进程也知道它是一个非交互式shell,并且不会加载任何“rc”或“profile”脚本;它的
sonar.sh
行为就像一个常规程序,并且只具有它继承的环境。在极少数情况下,您可以运行
bash -l -c "..."
强制它作为“登录”shell 运行,即使是非交互式的,从而从 .profile 加载环境,但这不一定是个好主意,除非您知道 .profile 写得很好并且不会启动随机的“登录时启动”的事情。1(而且 User= 也不构成完整的“登录”;它仅切换 UID/GID,并且可能设置“最低限度”环境(如 HOME)。服务通常不需要经历完整的登录过程。在极少数情况下,PAMName= 可以启用它,但这只是“预 shell”步骤,仍然不包括 Bash 本身。换句话说,Linux 上的用户登录由许多离散步骤组成,几乎所有这些步骤对于服务都被省略了。)