1
0
Fork 0
This repository has been archived on 2025-05-26. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
Checkpoint-Golang/restart.sh
2025-05-26 12:42:36 -05:00

125 lines
No EOL
4.9 KiB
Bash

#!/bin/bash
PID_FILE="server.pid"
# --- Find Go Executable ---
GO_EXECUTABLE=""
echo "Attempting to locate Go executable..."
# Prioritize standard manual install location
if [[ -x "/usr/local/go/bin/go" ]]; then
GO_EXECUTABLE="/usr/local/go/bin/go"
echo "Found Go executable at: $GO_EXECUTABLE (standard location)"
else
# Fallback: Check if 'go' is somehow in the current (sudo) PATH
echo "Go not found in /usr/local/go/bin. Checking PATH..."
if command -v go &> /dev/null; then
# Verify the result of command -v is executable
potential_go=$(command -v go)
if [[ -x "$potential_go" ]]; then
GO_EXECUTABLE="$potential_go"
echo "Found Go executable in PATH at: $GO_EXECUTABLE"
else
echo "Found 'go' via command -v, but '$potential_go' is not executable."
fi
else
echo "'go' command not found in PATH either."
fi
fi
# Check if we found a valid executable
if [[ -z "$GO_EXECUTABLE" ]]; then
echo "Error: Could not find a usable 'go' executable." >&2 # Error to stderr
echo "Checked /usr/local/go/bin/go and the PATH available to sudo." >&2
echo "Ensure Go is installed correctly and accessible." >&2
exit 1
fi
# --- End Find Go Executable ---
# --- Kill existing process ---
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if [[ "$PID" =~ ^[0-9]+$ ]]; then
echo "Attempting to kill process with PID: $PID"
# Check if process exists before trying to kill
if kill -0 "$PID" 2>/dev/null; then
kill "$PID"
sleep 0.5 # Give it a moment to shut down
# Verify kill (optional but good practice)
if kill -0 "$PID" 2>/dev/null; then
echo "Warning: Failed to kill process $PID. Trying kill -9..."
kill -9 "$PID"
sleep 0.5
fi
# Final check after kill attempts
if ! kill -0 "$PID" 2>/dev/null; then
echo "Process $PID killed."
else
echo "Error: Could not kill process $PID even with -9." >&2
# Consider exiting if kill fails critically
# exit 1
fi
else
echo "Process with PID $PID does not seem to be running."
fi
else
echo "Invalid PID '$PID' found in $PID_FILE. Removing stale file."
rm -f "$PID_FILE" # Use -f to avoid error if file gone
fi
else
echo "PID file '$PID_FILE' not found. Assuming server is not running."
fi
# --- Start the server (foreground, let app daemonize) ---
echo "Restarting server using: $GO_EXECUTABLE" # Show which executable is used
# Run the command, capture its output (stdout & stderr)
OUTPUT_CAPTURE=$(mktemp)
# Ensure temp file is cleaned up on exit (normal or error)
trap 'echo "Cleaning up temp file: $OUTPUT_CAPTURE"; rm -f -- "$OUTPUT_CAPTURE"' EXIT
# Execute the command, redirecting stdout and stderr to the temp file
# We also use 'tee' so the user sees the output in real-time
# Use 'if ! ...; then ... fi' structure for clarity on failure
if ! "$GO_EXECUTABLE" run main.go -p -b 2>&1 | tee "$OUTPUT_CAPTURE"; then
# This block executes if 'go run' exits with an error (non-zero status)
# This might happen if there's a compile error or immediate crash before daemonizing
echo "Error: '$GO_EXECUTABLE run' command failed with exit status $?. See output above and in $OUTPUT_CAPTURE" >&2
# Optionally 'cat $OUTPUT_CAPTURE' here if tee might not have flushed
exit 1
fi
# If the command succeeded (exit status 0), continue
echo "Go command finished (expected if daemonizing)."
# --- Extract PID from the application's captured output ---
# Look for the specific line the app prints using grep and extract the number
# -oP uses Perl-compatible regexes for lookbehind \K to get only the number
NEW_PID=$(grep -oP 'Server started in daemon mode with PID: \K[0-9]+' "$OUTPUT_CAPTURE")
# --- Verify and save PID ---
if [[ "$NEW_PID" =~ ^[0-9]+$ ]]; then
# Double-check if the extracted PID actually exists as a process
# Add a small delay in case the process needs a moment to stabilize after logging
sleep 0.2
if kill -0 "$NEW_PID" 2>/dev/null; then
echo "Server successfully started and daemonized with PID: $NEW_PID"
echo "$NEW_PID" > "$PID_FILE"
echo "PID saved to $PID_FILE."
else
# This is a potential race condition or the app failed right after logging PID
echo "Error: Extracted PID $NEW_PID from logs, but process $NEW_PID is not running." >&2
echo "The application might have failed immediately after starting." >&2
echo "Check full output in $OUTPUT_CAPTURE" >&2
# exit 1 # Decide if this is a fatal error
fi
else
echo "Error: Could not extract PID from server output in $OUTPUT_CAPTURE." >&2
echo "Expected a line like 'Server started in daemon mode with PID: XXXX'" >&2
# exit 1 # Decide if this is a fatal error
fi
# Cleanup happens automatically via trap
echo "Restart script finished."