我有一个在Kubernetes下运行Solr的系统,它是CI / CD管道的一部分。该系统通常也可以在“裸机”上运行Solr。在升级到Solr-7.7.1时,我发现如果k8s Solr已在运行,则裸机Solr将无法启动,因为它错误地得出了Solr已经在运行的结论。
这也可能是Solr 6.x中的问题,但是裸机进程(在systemd下运行)在k8s进程中赢得了竞争条件。在生产中可能也可以,但是我希望将来不必在启动和停止Solr时担心这一点。
问题出在Solr脚本(solr-7.7.1 / bin / solr)中:
if [[ "$SCRIPT_CMD" == "start" ]]; then
# see if Solr is already running
SOLR_PID=`solr_pid_by_port "$SOLR_PORT"`
if [ -z "$SOLR_PID" ]; then
# not found using the pid file ... but use ps to ensure not found
SOLR_PID=`ps auxww | grep start\.jar | grep -w "\-Djetty\.port=$SOLR_PORT" | grep -v grep | awk '{print $2}' | sort -r`
fi
if [ "$SOLR_PID" != "" ]; then
echo -e "\nPort $SOLR_PORT is already being used by another process (pid: $SOLR_PID)\nPlease choose a different port using the -p option.\n"
exit 1
fi
如果未运行裸机Solr,则将找不到SOLR_PID,并且第二次检查其jetty.port与我所需的端口(即默认的Solr端口)相匹配的进程也将找不到。
但是,该ps命令捕获了在kubelet的dockerd下运行的进程,从而导致误报。
是否存在某种方式(也许使用solr.in.sh中的设置)来更改if [ -z $SOLR_PID ];
测试的结果,以使脚本不会查看ps输出?