blob: 8f8f98ac64b140fccb3e531fb201b13515e1bb68 [file]
#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# Stop IoTDB Edge (the merged ConfigNode + DataNode process).
IOTDB_HOME="$(cd "$(dirname "$0")"/.. && pwd)"
PID_FILE="${IOTDB_HOME}/edge.pid"
is_same_edge_home() {
local command_line="$1"
case "$command_line" in
*"-DIOTDB_HOME=${IOTDB_HOME} "*|*"-DIOTDB_HOME=${IOTDB_HOME}")
return 0
;;
*)
return 1
;;
esac
}
is_edge_process() {
local pid="$1"
local command_line
command_line=$(ps -ww -p "$pid" -o command= 2>/dev/null)
[ -n "$command_line" ] || return 1
printf '%s\n' "$command_line" | grep -F -- "org.apache.iotdb.edge.EdgeNode" >/dev/null || return 1
is_same_edge_home "$command_line"
}
find_edge_processes() {
local process_line
local pid
while IFS= read -r process_line; do
printf '%s\n' "$process_line" | grep -F -- "org.apache.iotdb.edge.EdgeNode" >/dev/null || continue
is_same_edge_home "$process_line" || continue
pid=$(printf '%s\n' "$process_line" | awk '{print $1}')
printf '%s\n' "$pid"
done < <(ps -axww -o pid= -o command= 2>/dev/null)
}
stop_edge_process() {
local pid="$1"
if ! is_edge_process "$pid"; then
echo "Refusing to stop PID $pid because it is not IoTDB Edge from ${IOTDB_HOME}."
return 1
fi
if ! kill "$pid" 2>/dev/null; then
echo "Failed to stop IoTDB Edge process $pid."
return 1
fi
for i in $(seq 1 30); do
kill -0 "$pid" 2>/dev/null || break
sleep 1
done
if kill -0 "$pid" 2>/dev/null; then
if ! is_edge_process "$pid"; then
echo "Refusing to force-stop PID $pid because it no longer belongs to this IoTDB Edge installation."
return 1
fi
kill -9 "$pid" 2>/dev/null
fi
echo "IoTDB Edge process $pid stopped."
}
PID=""
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
case "$PID" in
''|*[!0-9]*)
echo "Ignoring invalid PID file ${PID_FILE}."
PID=""
;;
esac
if [ -n "$PID" ] && ! is_edge_process "$PID"; then
echo "Ignoring stale PID file ${PID_FILE}; PID $PID does not belong to this IoTDB Edge installation."
PID=""
fi
rm -f "$PID_FILE"
fi
if [ -n "$PID" ]; then
stop_edge_process "$PID"
exit $?
fi
FOUND=false
while IFS= read -r PID; do
[ -n "$PID" ] || continue
FOUND=true
stop_edge_process "$PID" || exit 1
done < <(find_edge_processes)
if [ "$FOUND" = false ]; then
echo "No IoTDB Edge process from ${IOTDB_HOME} is running."
fi
exit 0