v1.2
This commit is contained in:
Regular → Executable
+70
-10
@@ -91,6 +91,45 @@ service_ready() {
|
||||
esac
|
||||
}
|
||||
|
||||
service_listener_pids() {
|
||||
local service=$1
|
||||
local port
|
||||
|
||||
port=$(service_port "$service") || return 0
|
||||
ss -ltnp "( sport = :$port )" 2>/dev/null \
|
||||
| grep -o 'pid=[0-9]\+' \
|
||||
| cut -d= -f2 \
|
||||
| sort -u
|
||||
}
|
||||
|
||||
kill_pid_tree() {
|
||||
local signal=$1
|
||||
local pid=$2
|
||||
|
||||
if [[ ! "$pid" =~ ^[0-9]+$ ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
kill "-$signal" -- "-$pid" >/dev/null 2>&1 || true
|
||||
pkill "-$signal" -P "$pid" >/dev/null 2>&1 || true
|
||||
kill "-$signal" "$pid" >/dev/null 2>&1 || true
|
||||
}
|
||||
|
||||
terminate_service_processes() {
|
||||
local service=$1
|
||||
local signal=$2
|
||||
local pid=${3:-}
|
||||
local listener_pid
|
||||
|
||||
if [ -n "$pid" ]; then
|
||||
kill_pid_tree "$signal" "$pid"
|
||||
fi
|
||||
|
||||
while IFS= read -r listener_pid; do
|
||||
kill_pid_tree "$signal" "$listener_pid"
|
||||
done < <(service_listener_pids "$service")
|
||||
}
|
||||
|
||||
start_one() {
|
||||
local service=$1
|
||||
local cmd
|
||||
@@ -184,26 +223,47 @@ start_one() {
|
||||
stop_one() {
|
||||
local service=$1
|
||||
local pid_file
|
||||
local pid=""
|
||||
local attempt
|
||||
|
||||
pid_file=$(service_pid_file "$service")
|
||||
|
||||
if [ ! -f "$pid_file" ]; then
|
||||
if [ -f "$pid_file" ]; then
|
||||
pid=$(cat "$pid_file")
|
||||
fi
|
||||
|
||||
if [ -z "$pid" ] && ! service_ready "$service"; then
|
||||
echo "$service not running"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local pid
|
||||
pid=$(cat "$pid_file")
|
||||
if kill -0 "$pid" >/dev/null 2>&1; then
|
||||
kill "$pid" >/dev/null 2>&1 || true
|
||||
sleep 2
|
||||
if kill -0 "$pid" >/dev/null 2>&1; then
|
||||
kill -9 "$pid" >/dev/null 2>&1 || true
|
||||
terminate_service_processes "$service" TERM "$pid"
|
||||
|
||||
for attempt in $(seq 1 20); do
|
||||
if ! has_live_pid "$service" && ! service_ready "$service"; then
|
||||
rm -f "$pid_file"
|
||||
echo "stopped $service"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
sleep 1
|
||||
done
|
||||
|
||||
terminate_service_processes "$service" KILL "$pid"
|
||||
|
||||
for attempt in $(seq 1 5); do
|
||||
if ! has_live_pid "$service" && ! service_ready "$service"; then
|
||||
rm -f "$pid_file"
|
||||
echo "stopped $service"
|
||||
return 0
|
||||
fi
|
||||
|
||||
sleep 1
|
||||
done
|
||||
|
||||
rm -f "$pid_file"
|
||||
echo "stopped $service"
|
||||
echo "failed to stop $service cleanly" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
status_one() {
|
||||
|
||||
Reference in New Issue
Block a user