Java Elasticsearch:无法启动Windows服务。必须设置系统属性[es.path.conf]
我们面临一个来自多个用户的问题,他们无法在机器上使用Elasticsearch(windows服务无法启动)。正在使用的版本是6.6.0 我们从现场得到的信息非常差,不足以对问题做出良好的诊断(希望我们得到更好的信息)。然而,以下是我们所知道的:Java Elasticsearch:无法启动Windows服务。必须设置系统属性[es.path.conf],java,
elasticsearch,procrun,Java,
elasticsearch,Procrun,我们面临一个来自多个用户的问题,他们无法在机器上使用Elasticsearch(windows服务无法启动)。正在使用的版本是6.6.0 我们从现场得到的信息非常差,不足以对问题做出良好的诊断(希望我们得到更好的信息)。然而,以下是我们所知道的: 标准输出日志文件指向以下内容: 服务安装/启动批处理文件指出服务已正确安装和启动。此外,在安装过程中设置了-Des.path.conf=“C:\ProgramData\Elastic\Elasticsearch\config” 据我们所知,E
- 标准输出日志文件指向以下内容:
- 服务安装/启动批处理文件指出服务已正确安装和启动。此外,在安装过程中设置了
-Des.path.conf=“C:\ProgramData\Elastic\Elasticsearch\config”
- 据我们所知,ES_HOME和ES_PATH_CONF设置为:
System.getProperty(“es.path.conf”)
似乎正在返回null
作为总结,我看到以下内容:
C:\Program Files\Elastic\Elasticsearch>"C:\Program Files\Elastic\Elasticsearch\bin\elasticsearch-service-x64.exe" //IS//elasticsearch-service-x64 --Startup auto --StopTimeout 0 --StartClass org.elasticsearch.bootstrap.Elasticsearch --StartMethod main ++StartParams --quiet --StopClass org.elasticsearch.bootstrap.Elasticsearch --StopMethod close --Classpath "C:\Program Files\Elastic\Elasticsearch\lib\*" --JvmMs 256 --JvmMx 256 --JvmSs 1024 --JvmOptions -Xms256m;-Xmx256m;-XX:+UseConcMarkSweepGC;-XX:CMSInitiatingOccupancyFraction=75;-XX:+UseCMSInitiatingOccupancyOnly;-Des.networkaddress.cache.ttl=60;-Des.networkaddress.cache.negative.ttl=10;-XX:+AlwaysPreTouch;-Xss1m;-Djava.awt.headless=true;-Dfile.encoding=UTF-8;-Djna.nosys=true;-XX:-OmitStackTraceInFastThrow;-Dio.netty.noUnsafe=true;-Dio.netty.noKeySetOptimization=true;-Dio.netty.recycler.maxCapacityPerThread=0;-Dlog4j.shutdownHookEnabled=false;-Dlog4j2.disable.jmx=true;-Djava.io.tmpdir=C:\Users\KE'SBU~1\AppData\Local\Temp\elasticsearch;-XX:+HeapDumpOnOutOfMemoryError;-XX:HeapDumpPath=data;-XX:ErrorFile=logs/hs_err_pid%p.log;-XX:+PrintGCDetails;-XX:+PrintGCDateStamps;-XX:+PrintTenuringDistribution;-XX:+PrintGCApplicationStoppedTime;-Xloggc:logs/gc.log;-XX:+UseGCLogFileRotation;-XX:NumberOfGCLogFiles=32;-XX:GCLogFileSize=64m ++JvmOptions -Delasticsearch;-Des.path.home="C:\Program Files\Elastic\Elasticsearch";-Des.path.conf="C:\ProgramData\Elastic\Elasticsearch\config";-Des.distribution.flavor="default";-Des.distribution.type="zip" --LogPath "C:\Program Files\Elastic\Elasticsearch\logs" --LogPrefix "elasticsearch-service-x64" --StdError auto --StdOutput auto --PidFile "elasticsearch-service-x64.pid" --DisplayName "Elasticsearch 6.6.0 (elasticsearch-service-x64)" --Description "Elasticsearch 6.6.0 Windows Service - https://elastic.co" --Jvm "C:\Program Files\Elastic\Elasticsearch\jdk\jre\bin\server\jvm.dll" --StartMode jvm --StopMode jvm --StartPath "C:\Program Files\Elastic\Elasticsearch" ++Environment HOSTNAME="%COMPUTERNAME%"
- 环境变量集
- 使用Java选项安装Windows服务
-Des.path.conf=“C:\ProgramData\Elastic\Elasticsearch\config”
- Windows服务显示
错误:必须设置系统属性[es.path.conf]
elasticsearch服务mgr.exe
,因此我们可以检查es.path.conf
的实际值
我们错过了什么?有人知道为什么ES会抛出那个错误吗
提前谢谢
更新
我们能够连接到一台有问题的机器。问题的罪魁祸首不知何故是窗口用户名
从前面的日志文件中,我们可以看到对服务的调用如下:
C:\Program Files\Elastic\Elasticsearch>"C:\Program Files\Elastic\Elasticsearch\bin\elasticsearch-service-x64.exe" //IS//elasticsearch-service-x64 --Startup auto --StopTimeout 0 --StartClass org.elasticsearch.bootstrap.Elasticsearch --StartMethod main ++StartParams --quiet --StopClass org.elasticsearch.bootstrap.Elasticsearch --StopMethod close --Classpath "C:\Program Files\Elastic\Elasticsearch\lib\*" --JvmMs 256 --JvmMx 256 --JvmSs 1024 --JvmOptions -Xms256m;-Xmx256m;-XX:+UseConcMarkSweepGC;-XX:CMSInitiatingOccupancyFraction=75;-XX:+UseCMSInitiatingOccupancyOnly;-Des.networkaddress.cache.ttl=60;-Des.networkaddress.cache.negative.ttl=10;-XX:+AlwaysPreTouch;-Xss1m;-Djava.awt.headless=true;-Dfile.encoding=UTF-8;-Djna.nosys=true;-XX:-OmitStackTraceInFastThrow;-Dio.netty.noUnsafe=true;-Dio.netty.noKeySetOptimization=true;-Dio.netty.recycler.maxCapacityPerThread=0;-Dlog4j.shutdownHookEnabled=false;-Dlog4j2.disable.jmx=true;-Djava.io.tmpdir=C:\Users\KE'SBU~1\AppData\Local\Temp\elasticsearch;-XX:+HeapDumpOnOutOfMemoryError;-XX:HeapDumpPath=data;-XX:ErrorFile=logs/hs_err_pid%p.log;-XX:+PrintGCDetails;-XX:+PrintGCDateStamps;-XX:+PrintTenuringDistribution;-XX:+PrintGCApplicationStoppedTime;-Xloggc:logs/gc.log;-XX:+UseGCLogFileRotation;-XX:NumberOfGCLogFiles=32;-XX:GCLogFileSize=64m ++JvmOptions -Delasticsearch;-Des.path.home="C:\Program Files\Elastic\Elasticsearch";-Des.path.conf="C:\ProgramData\Elastic\Elasticsearch\config";-Des.distribution.flavor="default";-Des.distribution.type="zip" --LogPath "C:\Program Files\Elastic\Elasticsearch\logs" --LogPrefix "elasticsearch-service-x64" --StdError auto --StdOutput auto --PidFile "elasticsearch-service-x64.pid" --DisplayName "Elasticsearch 6.6.0 (elasticsearch-service-x64)" --Description "Elasticsearch 6.6.0 Windows Service - https://elastic.co" --Jvm "C:\Program Files\Elastic\Elasticsearch\jdk\jre\bin\server\jvm.dll" --StartMode jvm --StopMode jvm --StartPath "C:\Program Files\Elastic\Elasticsearch" ++Environment HOSTNAME="%COMPUTERNAME%"
有趣的部分是如何设置-Djava.io.tmpdir=C:\Users\KE'SBU~1\AppData\Local\Temp\elasticsearch
。如您所见,路径包含一个单引号字符
通过查看procrun存储java参数的注册表项,我们可以看到所有java选项都因此而中断(单引号不存在,并且-Djava.io.tmpdir
后面的JVM选项似乎没有被解析):
因此,在我看来,问题在于JVM选项被解析的地方,不允许使用单引号字符
更新2
从Procrun文档中:
++JVMPoptions以-D或-X的形式列出将传递给JVM的选项。选项之间使用#或;人物。如果需要嵌入#或;字符将它们放在单引号内。(未在exe模式下使用。)
这在某种程度上意味着单引号是#和;…的转义字符。。。但是,如何摆脱单一的报价
更新3
为ES打开了一个问题,包含一个解决方法->我记得,如果使用
%variable%
和,脚本中的Windows变量替换会有不同的行为!变数代码>语法。我对Elasticsearch也有类似的问题,最后修改了Elasticsearch.bat
和Elasticsearch env.bat
以使用代码>问题变量的替换。很抱歉,我找不到这个链接。@grog谢谢你的评论。但是,我认为问题不在ES批处理文件上,因为它的输出是正确的(传递给procrun的值是-Djava.io.tmpdir=C:\Users\KE'SBU~1\AppData\Local\Temp\elasticsearch)。我认为问题更多的是procrun如何解析路径,更准确地说是单个引号的含义。
C:\Program Files\Elastic\Elasticsearch>"C:\Program Files\Elastic\Elasticsearch\bin\elasticsearch-service-x64.exe" //ES//elasticsearch-service-x64 --LogPath "C:\Program Files\Elastic\Elasticsearch\logs" --LogPrefix "elasticsearch-service-x64" --StdError auto --StdOutput auto
C:\Program Files\Elastic\Elasticsearch>if not errorlevel 1 goto started
C:\Program Files\Elastic\Elasticsearch>echo The service 'elasticsearch-service-x64' has been started
The service 'elasticsearch-service-x64' has been started
C:\Program Files\Elastic\Elasticsearch>goto:eof
C:\>echo %ES_HOME%
C:\Program Files\Elastic\Elasticsearch
C:\>echo %ES_PATH_CONF%
C:\ProgramData\Elastic\Elasticsearch\config
C:\Program Files\Elastic\Elasticsearch>"C:\Program Files\Elastic\Elasticsearch\bin\elasticsearch-service-x64.exe" //IS//elasticsearch-service-x64 --Startup auto --StopTimeout 0 --StartClass org.elasticsearch.bootstrap.Elasticsearch --StartMethod main ++StartParams --quiet --StopClass org.elasticsearch.bootstrap.Elasticsearch --StopMethod close --Classpath "C:\Program Files\Elastic\Elasticsearch\lib\*" --JvmMs 256 --JvmMx 256 --JvmSs 1024 --JvmOptions -Xms256m;-Xmx256m;-XX:+UseConcMarkSweepGC;-XX:CMSInitiatingOccupancyFraction=75;-XX:+UseCMSInitiatingOccupancyOnly;-Des.networkaddress.cache.ttl=60;-Des.networkaddress.cache.negative.ttl=10;-XX:+AlwaysPreTouch;-Xss1m;-Djava.awt.headless=true;-Dfile.encoding=UTF-8;-Djna.nosys=true;-XX:-OmitStackTraceInFastThrow;-Dio.netty.noUnsafe=true;-Dio.netty.noKeySetOptimization=true;-Dio.netty.recycler.maxCapacityPerThread=0;-Dlog4j.shutdownHookEnabled=false;-Dlog4j2.disable.jmx=true;-Djava.io.tmpdir=C:\Users\KE'SBU~1\AppData\Local\Temp\elasticsearch;-XX:+HeapDumpOnOutOfMemoryError;-XX:HeapDumpPath=data;-XX:ErrorFile=logs/hs_err_pid%p.log;-XX:+PrintGCDetails;-XX:+PrintGCDateStamps;-XX:+PrintTenuringDistribution;-XX:+PrintGCApplicationStoppedTime;-Xloggc:logs/gc.log;-XX:+UseGCLogFileRotation;-XX:NumberOfGCLogFiles=32;-XX:GCLogFileSize=64m ++JvmOptions -Delasticsearch;-Des.path.home="C:\Program Files\Elastic\Elasticsearch";-Des.path.conf="C:\ProgramData\Elastic\Elasticsearch\config";-Des.distribution.flavor="default";-Des.distribution.type="zip" --LogPath "C:\Program Files\Elastic\Elasticsearch\logs" --LogPrefix "elasticsearch-service-x64" --StdError auto --StdOutput auto --PidFile "elasticsearch-service-x64.pid" --DisplayName "Elasticsearch 6.6.0 (elasticsearch-service-x64)" --Description "Elasticsearch 6.6.0 Windows Service - https://elastic.co" --Jvm "C:\Program Files\Elastic\Elasticsearch\jdk\jre\bin\server\jvm.dll" --StartMode jvm --StopMode jvm --StartPath "C:\Program Files\Elastic\Elasticsearch" ++Environment HOSTNAME="%COMPUTERNAME%"
-Xms256m
-Xmx256m
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-Des.networkaddress.cache.ttl=60
-Des.networkaddress.cache.negative.ttl=10
-XX:+AlwaysPreTouch
-Xss1m
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-Djna.nosys=true
-XX:-OmitStackTraceInFastThrow
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Djava.io.tmpdir=C:\Users\KESBU~1\AppData\Local\Temp\elasticsearch;- XX:+HeapDumpOnOutOfMemoryError;-XX:HeapDumpPath=data;-XX:ErrorFile=logs/hs_err_pid%p.log;-XX:+PrintGCDetails;-XX:+PrintGCDateStamps;-XX:+PrintTenuringDistribution;-XX:+PrintGCApplicationStoppedTime;-Xloggc:logs/gc.log;-XX:+UseGCLogFileRotation;-XX:NumberOfGCLogFiles=32;-XX:GCLogFileSize=64m
-Delasticsearch
-Des.path.home=C:\Program Files\Elastic\Elasticsearch
-Des.path.conf=C:\ProgramData\Elastic\Elasticsearch\config
-Des.distribution.flavor=default
-Des.distribution.type=zip