This commit is contained in:
Codex
2026-04-01 11:45:23 -06:00
parent d2c7941aaa
commit a2d4f9d86d
4 changed files with 82 additions and 18 deletions
Regular → Executable
+70 -10
View File
@@ -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() {