重启后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身份启动。
解决步骤
修改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用户运行。调整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检查SonarQube配置文件
打开/my/custom/path/sonarqube-9.6.1.59531/conf/sonar.properties,确认sonar.es.javaOpts等ES相关参数中没有设置会导致以root运行的配置。清理残留进程与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
相关产品推荐
相关产品推荐

