You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重启后SonarQube无法启动,Elasticsearch报root运行错误

服务器重启后SonarQube无法启动:Elasticsearch报root用户运行错误

问题现象

  • 服务器重启后SonarQube启动失败,执行 systemctl status sonar 输出:
sonar.local.lab sonar.sh[4471]: Gracefully stopping SonarQube...
sonar.local.lab sonar.sh[4471]: Removed stale pid file: ./SonarQube.pid
sonar.local.lab sonar.sh[4471]: SonarQube was not running.
  • 查看 /var/log/sonarqube/es.log 发现核心报错:
java.lang.RuntimeException: can not run elasticsearch as root
        at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:107) ~[elasticsearch-7.17.4.jar:7.17.4]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:183) ~[elasticsearch-7.17.4.jar:7.17.4]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434) [elasticsearch-7.17.4.jar:7.17.4]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:166) [elasticsearch-7.17.4.jar:7.17.4]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:157) [elasticsearch-7.17.4.jar:7.17.4]
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77) [elasticsearch-7.17.4.jar:7.17.4]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112) [elasticsearch-cli-7.17.4.jar:7.17.4]
        at org.elasticsearch.cli.Command.main(Command.java:77) [elasticsearch-cli-7.17.4.jar:7.17.4]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:122) [elasticsearch-7.17.4.jar:7.17.4]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80) [elasticsearch-7.17.4.jar:7.17.4]
2023.11.01 16:26:49 ERROR es[][o.e.b.ElasticsearchUncaughtExceptionHandler] uncaught exception in thread [main]
  • 当前 /etc/systemd/system/sonar.service 配置如下:
[Unit]
Description=SonarQube 9.6.1.59531 service
Requires=network.target
After=network.target network-online.target
Wants=network-online.target

[Service]
Type=forking
User=sonar
Group=sonar
ExecStart=/my/custom/path/sonarqube-9.6.1.59531/bin/linux-x86-64/sonar.sh start
ExecStop=/my/custom/path/sonarqube-9.6.1.59531/bin/linux-x86-64/sonar.sh stop
ExecReload=/my/custom/path/sonarqube-9.6.1.59531/bin/linux-x86-64/sonar.sh restart
Restart=on-failure
RestartSec=10
PIDFile=/my/custom/path/sonarqube-9.6.1.59531/bin/linux-x86-64/SonarQube.pid
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
  • 已确认 sonar 用户及组是 /my/custom/path/ 下所有文件的所有者,但执行 systemctl restart sonar 后错误依旧。

排查与解决方法

原因分析

尽管systemd配置了以sonar用户运行,但sonar.sh脚本启动Elasticsearch时可能存在权限继承问题,或者脚本内部切换用户的逻辑失效,导致ES进程尝试以root身份启动。

解决步骤

  1. 修改sonar.sh脚本,强制指定用户启动ES
    编辑 /my/custom/path/sonarqube-9.6.1.59531/bin/linux-x86-64/sonar.sh,找到启动Elasticsearch的代码段,用 su sonar -c "启动命令" 或者 runuser -u sonar -- 启动命令 包裹ES启动指令,确保ES以sonar用户运行。

  2. 调整systemd配置,绕过shell脚本启动
    直接在systemd中配置启动SonarQube的Java进程,避免脚本带来的权限问题:
    修改 /etc/systemd/system/sonar.service 的[Service]段为:

    [Service]
    Type=simple
    User=sonar
    Group=sonar
    ExecStart=/usr/bin/java -jar /my/custom/path/sonarqube-9.6.1.59531/lib/sonar-application-9.6.1.59531.jar
    ExecStop=/usr/bin/pkill -u sonar -f sonar-application
    Restart=on-failure
    RestartSec=10
    LimitNOFILE=65536
    WorkingDirectory=/my/custom/path/sonarqube-9.6.1.59531
    

    执行以下命令生效:

    systemctl daemon-reload
    systemctl restart sonar
    
  3. 检查SonarQube配置文件
    打开 /my/custom/path/sonarqube-9.6.1.59531/conf/sonar.properties,确认 sonar.es.javaOpts 等ES相关参数中没有设置会导致以root运行的配置。

  4. 清理残留进程与PID文件
    执行以下命令彻底清理后重启服务:

    pkill -u root -f elasticsearch
    rm -f /my/custom/path/sonarqube-9.6.1.59531/bin/linux-x86-64/SonarQube.pid
    systemctl restart sonar
    

内容的提问来源于stack exchange,提问作者N. J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:15:16