mirror of
https://github.com/DeBrosOfficial/network.git
synced 2025-12-11 09:18:50 +00:00
feat: add script for graceful shutdown and process cleanup
- Introduced a new script `dev-kill-all.sh` to handle graceful shutdown of development processes and cleanup of stale PID files. - Updated Makefile to include a `kill` command that utilizes the new script for improved process management. - Enhanced the shutdown process to verify that required ports are free after termination of processes.
This commit is contained in:
parent
80ea58848b
commit
a72aebc1fe
14
CHANGELOG.md
14
CHANGELOG.md
@ -13,6 +13,20 @@ The format is based on [Keep a Changelog][keepachangelog] and adheres to [Semant
|
||||
### Deprecated
|
||||
|
||||
### Fixed
|
||||
## [0.63.2] - 2025-11-10
|
||||
|
||||
### Added
|
||||
\n
|
||||
### Changed
|
||||
- Improved process termination logic in development environments to ensure child processes are also killed.
|
||||
- Enhanced the `dev-kill-all.sh` script to reliably kill all processes using development ports, including orphaned processes and their children.
|
||||
|
||||
### Deprecated
|
||||
|
||||
### Removed
|
||||
|
||||
### Fixed
|
||||
\n
|
||||
## [0.63.1] - 2025-11-10
|
||||
|
||||
### Added
|
||||
|
||||
2
Makefile
2
Makefile
@ -21,7 +21,7 @@ test-e2e:
|
||||
|
||||
.PHONY: build clean test run-node run-node2 run-node3 run-example deps tidy fmt vet lint clear-ports install-hooks kill
|
||||
|
||||
VERSION := 0.63.1
|
||||
VERSION := 0.63.2
|
||||
COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)
|
||||
DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
LDFLAGS := -X 'main.version=$(VERSION)' -X 'main.commit=$(COMMIT)' -X 'main.date=$(DATE)'
|
||||
|
||||
@ -1022,7 +1022,7 @@ func (pm *ProcessManager) startGateway(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// stopProcess terminates a managed process
|
||||
// stopProcess terminates a managed process and its children
|
||||
func (pm *ProcessManager) stopProcess(name string) error {
|
||||
pidPath := filepath.Join(pm.pidsDir, fmt.Sprintf("%s.pid", name))
|
||||
pidBytes, err := os.ReadFile(pidPath)
|
||||
@ -1030,8 +1030,9 @@ func (pm *ProcessManager) stopProcess(name string) error {
|
||||
return nil // Process not running or PID not found
|
||||
}
|
||||
|
||||
pid, err := strconv.Atoi(string(pidBytes))
|
||||
pid, err := strconv.Atoi(strings.TrimSpace(string(pidBytes)))
|
||||
if err != nil {
|
||||
os.Remove(pidPath)
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -1041,7 +1042,25 @@ func (pm *ProcessManager) stopProcess(name string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Try graceful shutdown first
|
||||
proc.Signal(os.Interrupt)
|
||||
|
||||
// Wait a bit for graceful shutdown
|
||||
time.Sleep(500 * time.Millisecond)
|
||||
|
||||
// Check if process is still running
|
||||
if checkProcessRunning(pid) {
|
||||
// Force kill if still running
|
||||
proc.Signal(os.Kill)
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
|
||||
// Also kill any child processes (platform-specific)
|
||||
if runtime.GOOS != "windows" {
|
||||
// Use pkill to kill children on Unix-like systems
|
||||
exec.Command("pkill", "-9", "-P", fmt.Sprintf("%d", pid)).Run()
|
||||
}
|
||||
}
|
||||
|
||||
os.Remove(pidPath)
|
||||
|
||||
fmt.Fprintf(pm.logWriter, "✓ %s stopped\n", name)
|
||||
|
||||
@ -4,30 +4,75 @@ set -euo pipefail
|
||||
echo "Force killing all processes on dev ports..."
|
||||
|
||||
# Define all dev ports
|
||||
PORTS=(4001 4501 4502 4503 5001 5002 5003 6001 7001 7002 7003 9094 9104 9114 3320 3322 9050 8080 8081 8082)
|
||||
PORTS=(4001 4002 4003 4101 4102 4103 4501 4502 4503 5001 5002 5003 6001 7001 7002 7003 7501 7502 7503 8080 8081 8082 9094 9095 9096 9097 9104 9105 9106 9107 9114 9115 9116 9117 3320 3322 9050)
|
||||
|
||||
killed_count=0
|
||||
killed_pids=()
|
||||
|
||||
# Kill all processes using these ports (LISTEN, ESTABLISHED, or any state)
|
||||
for port in "${PORTS[@]}"; do
|
||||
# Get all PIDs listening on this port
|
||||
pids=$(lsof -nP -iTCP:"$port" -sTCP:LISTEN -t 2>/dev/null || true)
|
||||
# Get all PIDs using this port in ANY TCP state
|
||||
pids=$(lsof -nP -iTCP:"$port" -t 2>/dev/null || true)
|
||||
if [[ -n "$pids" ]]; then
|
||||
echo "Killing processes on port $port: $pids"
|
||||
echo "$pids" | xargs -r kill -9 || true
|
||||
for pid in $pids; do
|
||||
# Kill the process and all its children
|
||||
kill -9 "$pid" 2>/dev/null || true
|
||||
# Also kill any children of this process
|
||||
pkill -9 -P "$pid" 2>/dev/null || true
|
||||
killed_pids+=("$pid")
|
||||
done
|
||||
killed_count=$((killed_count + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
# Also kill processes by command name patterns (in case they're orphaned)
|
||||
# This catches processes that might be using debros ports but not showing up in lsof
|
||||
COMMANDS=("node" "ipfs" "ipfs-cluster-service" "rqlited" "olric-server" "gateway")
|
||||
for cmd in "${COMMANDS[@]}"; do
|
||||
# Find all processes with this command name
|
||||
all_pids=$(pgrep -f "^.*$cmd.*" 2>/dev/null || true)
|
||||
if [[ -n "$all_pids" ]]; then
|
||||
for pid in $all_pids; do
|
||||
# Check if this process is using any of our dev ports
|
||||
port_match=$(lsof -nP -p "$pid" -iTCP 2>/dev/null | grep -E ":(400[1-3]|410[1-3]|450[1-3]|500[1-3]|6001|700[1-3]|750[1-3]|808[0-2]|909[4-7]|910[4-7]|911[4-7]|332[02]|9050)" || true)
|
||||
if [[ -n "$port_match" ]]; then
|
||||
echo "Killing orphaned $cmd process (PID: $pid) using dev ports"
|
||||
kill -9 "$pid" 2>/dev/null || true
|
||||
pkill -9 -P "$pid" 2>/dev/null || true
|
||||
killed_pids+=("$pid")
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
# Clean up PID files
|
||||
PIDS_DIR="$HOME/.debros/.pids"
|
||||
if [[ -d "$PIDS_DIR" ]]; then
|
||||
rm -f "$PIDS_DIR"/*.pid || true
|
||||
fi
|
||||
|
||||
if [[ $killed_count -eq 0 ]]; then
|
||||
echo "✓ No processes found on dev ports"
|
||||
# Remove duplicates and report
|
||||
if [[ ${#killed_pids[@]} -gt 0 ]]; then
|
||||
unique_pids=($(printf '%s\n' "${killed_pids[@]}" | sort -u))
|
||||
echo "✓ Killed ${#unique_pids[@]} unique process(es) on $killed_count port(s)"
|
||||
else
|
||||
echo "✓ Killed processes on $killed_count port(s)"
|
||||
echo "✓ No processes found on dev ports"
|
||||
fi
|
||||
|
||||
echo "✓ All dev ports should now be free"
|
||||
# Final verification: check if any ports are still in use
|
||||
still_in_use=0
|
||||
for port in "${PORTS[@]}"; do
|
||||
pids=$(lsof -nP -iTCP:"$port" -t 2>/dev/null || true)
|
||||
if [[ -n "$pids" ]]; then
|
||||
echo "⚠️ Warning: Port $port still in use by: $pids"
|
||||
still_in_use=$((still_in_use + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ $still_in_use -eq 0 ]]; then
|
||||
echo "✓ All dev ports are now free"
|
||||
else
|
||||
echo "⚠️ $still_in_use port(s) still in use - you may need to manually kill processes"
|
||||
fi
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user