Files
ports/textproc/apache-solr/files/patch-bin_solr
T
Raivo Hool 1691685481 textproc/apache-solr: start by default in standalone mode
Use a more failure proof usage of sockstat to detect in startup script
if solr is already running.
2026-04-14 06:39:57 +02:00

106 lines
4.1 KiB
Plaintext
Executable File

--- bin/solr.orig 2026-01-02 20:59:41.000000000 +0000
+++ bin/solr 2026-03-22 17:27:21.259092000 +0000
@@ -49,6 +49,13 @@
SOLR_SCRIPT="$0"
verbose=false
THIS_OS=$(uname -s)
+
+SOLR_PORT_PID_TOOL=""
+if [ "$THIS_OS" == "FreeBSD" ] && command -v sockstat > /dev/null 2>&1; then
+ SOLR_PORT_PID_TOOL="sockstat"
+elif command -v lsof > /dev/null 2>&1 && lsof -v 2>&1 | grep -q revision; then
+ SOLR_PORT_PID_TOOL="lsof"
+fi
# What version of Java is required to run this version of Solr.
JAVA_VER_REQ=21
@@ -475,15 +482,36 @@
fi
}
-# extract the value of the -Dsolr.port.listen parameter from a running Solr process
+# given a port, find the pid of a process that is actively listening on it
+function listening_pid_by_port() {
+ local the_port="$1"
+ local listening_pid=""
+
+ if [ "$SOLR_PORT_PID_TOOL" == "sockstat" ]; then
+ listening_pid=$(
+ {
+ sockstat -4 -l -P tcp -p "$the_port" 2>/dev/null || :
+ sockstat -6 -l -P tcp -p "$the_port" 2>/dev/null || :
+ } | awk '$1 != "USER" { print $3; exit }'
+ )
+ elif [ "$SOLR_PORT_PID_TOOL" == "lsof" ]; then
+ listening_pid=$(lsof -t -PniTCP:"$the_port" -sTCP:LISTEN 2>/dev/null | sed -n '1p' || :)
+ fi
+
+ if [ -n "${listening_pid:-}" ]; then
+ echo "$listening_pid"
+ fi
+}
+
+# extract the value of the listening port parameter from a running Solr process
function solr_port_listen() {
SOLR_PID="$1"
- SOLR_PROC=$(ps -fww -p "$SOLR_PID" | grep start\.jar | grep solr\.port\.listen)
+ SOLR_PROC=$(ps -fww -p "$SOLR_PID" | grep start\.jar | grep -E 'solr\.port\.listen|jetty\.port')
IFS=' ' read -a proc_args <<< "$SOLR_PROC"
for arg in "${proc_args[@]}"
do
IFS='=' read -a pair <<< "$arg"
- if [ "${pair[0]}" == "-Dsolr.port.listen" ]; then
+ if [ "${pair[0]}" == "-Dsolr.port.listen" ] || [ "${pair[0]}" == "-Djetty.port" ]; then
local solr_port="${pair[1]}"
break
fi
@@ -983,8 +1011,8 @@
SOLR_PID=$(solr_pid_by_port "$SOLR_PORT_LISTEN")
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 | awk "/\-Dsolr\.port\.listen=$SOLR_PORT_LISTEN/"' {print $2}' | sort -r)
+ # not found using the pid file ... but check if any process is already listening on the port
+ SOLR_PID=$(listening_pid_by_port "$SOLR_PORT_LISTEN")
fi
if [ -n "${SOLR_PID:-}" ]; then
@@ -1351,14 +1379,13 @@
fi
fi
- # no lsof on cygwin though
- if lsof -v 2>&1 | grep -q revision; then
+ if [ -n "$SOLR_PORT_PID_TOOL" ]; then
echo -n "Waiting up to $SOLR_START_WAIT seconds to see Solr running on port $SOLR_PORT_LISTEN"
# Launch in a subshell to show the spinner
(loops=0
while true
do
- running=$(lsof -t -PniTCP:$SOLR_PORT_LISTEN -sTCP:LISTEN || :)
+ running=$(listening_pid_by_port "$SOLR_PORT_LISTEN")
if [ -z "${running:-}" ]; then
slept=$((loops * 2))
if [ $slept -lt $SOLR_START_WAIT ]; then
@@ -1370,14 +1397,18 @@
exit # subshell!
fi
else
- SOLR_PID=$(ps auxww | grep start\.jar | awk "/\-Dsolr\.port\.listen=$SOLR_PORT_LISTEN/"' {print $2}' | sort -r)
+ SOLR_PID="$running"
echo -e "\nStarted Solr server on port $SOLR_PORT_LISTEN (pid=$SOLR_PID). Happy searching!\n"
exit # subshell!
fi
done) &
spinner $!
else
- echo -e "NOTE: Please install lsof as this script needs it to determine if Solr is listening on port $SOLR_PORT_LISTEN."
+ if [ "$THIS_OS" == "FreeBSD" ]; then
+ echo -e "NOTE: This script needs sockstat available in PATH to determine if Solr is listening on port $SOLR_PORT_LISTEN."
+ else
+ echo -e "NOTE: Please install lsof as this script needs it to determine if Solr is listening on port $SOLR_PORT_LISTEN."
+ fi
sleep 10
SOLR_PID=$(ps auxww | grep start\.jar | awk "/\-Dsolr\.port\.listen=$SOLR_PORT_LISTEN/"' {print $2}' | sort -r)
echo -e "\nStarted Solr server on port $SOLR_PORT_LISTEN (pid=$SOLR_PID). Happy searching!\n"