Windows Server启动SonarQube时Elasticsearch异常退出(错误码1)
问题详情
执行startsonar.bat时反复触发如下错误:
Elasticsearch exited unexpectedly, with exit code 1
已尝试的排查操作:
- 终止机器上所有Java进程
- 删除SonarQube安装目录下的
/data/es8文件夹 - 重启服务器
完整报错日志
Feb 22, 2024 12:36:03 PM sun.til.locale-provider.LocaleProviderAdapter WARNING: COMPAT locale provider will be removed in a future release ERROR: Elasticsearch did not exit normally - check the logs at D:\ISO\sonarqube-10.4.0.87286\sonarqube-10.4.0.87286\logs\sonarqube.log ERROR: Elasticsearch exited unexpectedly, with exit code 1 2024.02.22 12:36:09 WARN app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [ElasticSearch]: 2024.02.22 12:36:09 INFO app[][o.s.a.SchedulerImpl] Process [ElasticSearch] is stopped 2024.02.22 12:36:09 ERROR app[][o.s.a.p.EsManagedProcess] Failed to check status java.lang.RuntimeException: thread waiting for the response was interrupted at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:901) at org.elasticsearch.client.RestClient.performRequest(RestClient.java:300) at org.elasticsearch.client.RestClient.performRequest(RestClient.java:288) at org.elasticsearch.client.RestHighLevelClient.performClientRequest(RestHighLevelClient.java:2699) at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:2171) at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:2137) at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:2105) at org.elasticsearch.client.ClusterClient.health(ClusterClient.java:151) at org.sonar.application.es.EsConnectorImpl.getClusterHealthStatus(EsConnectorImpl.java:79) at org.sonar.application.process.EsManagedProcess.checkStatus(EsManagedProcess.java:92) at org.sonar.application.process.EsManagedProcess.checkOperational(EsManagedProcess.java:77) at org.sonar.application.process.EsManagedProcess.isOperational(EsManagedProcess.java) at org.sonar.application.process.ManagedProcessHandler.refreshState(ManagedProcessHandler.java:223) at org.sonar.application.process.ManagedProcessHandler$EventWatcher.run(ManagedProcessHandler.java:288) Caused by: java.lang.InterruptedException: null at java.base/java.lang.Object.wait(Native Method) at java.base/java.lang.Object.wait(Object.java:366) at java.base/java.lang.Object.wait(Object.java:359) at org.apache.http.concurrent.BasicFuture.get(BasicFuture.java:82) at org.apache.http.impl.nio.client.FutureWrapper.get(FutureWrapper.java:70) at org.elasticsearch.client.RestClient.performRequest(RestClient.java:296) 12 common frames omitted 2024.02.22 12:36:09 INFO app[][o.s.a.SchedulerImpl] SonarQube is stopped
解决方案建议
1. 查看Elasticsearch专属日志
SonarQube内置的Elasticsearch有独立日志目录:D:\ISO\sonarqube-10.4.0.87286\sonarqube-10.4.0.87286\logs\es\,里面的日志会明确记录启动失败的具体原因(如内存不足、端口被占、权限不足等),这是排查的核心依据。
2. 调整Elasticsearch内存配置
打开sonarqube-10.4.0.87286\conf\sonar.properties,找到以下配置项,根据服务器物理内存调整:
sonar.search.javaOpts=-Xmx512m -Xms512m
若服务器内存充足,可适度调高(例如-Xmx1024m -Xms1024m),但不要超过物理内存的50%。
3. 检查端口占用情况
Elasticsearch默认使用9001端口,执行以下命令排查是否被其他进程占用:
netstat -ano | findstr :9001
若被占用,可终止对应进程,或修改sonar.properties中的sonar.search.port配置更换端口。
4. 以管理员权限运行启动脚本
右键点击startsonar.bat,选择以管理员身份运行——Windows Server的权限限制可能导致Elasticsearch无法创建文件或绑定端口。
5. 验证Java版本兼容性
SonarQube 10.4要求Java 17,执行以下命令确认版本符合要求:
java -version
若版本不符,安装对应版本的OpenJDK(推荐Adoptium或Oracle OpenJDK),并确保JAVA_HOME环境变量指向正确路径。
6. 临时关闭防火墙/杀毒软件测试
Windows Defender或第三方杀毒软件可能拦截Elasticsearch的网络请求,临时关闭后重新启动SonarQube,排查是否为拦截问题。
7. 清理残留文件后重新初始化
除删除/data/es8外,可一并删除/temp和/logs目录下的旧文件,再尝试启动。
内容的提问来源于stack exchange,提问作者Muyiwa Aniyikaye

