You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
5.9 KiB
192 lines
5.9 KiB
#!/bin/bash
|
|
|
|
# kill_gr00t_wbc_processors.sh
|
|
# Kill gr00t_wbc processes in current container to prevent message passing conflicts
|
|
|
|
# Note: Don't use 'set -e' as tmux/pgrep commands may return non-zero exit codes
|
|
|
|
# Configuration
|
|
DRY_RUN=false
|
|
FORCE=false
|
|
QUIET=false
|
|
declare -A FOUND_PROCESSES
|
|
|
|
# Default to verbose mode if no arguments
|
|
[[ $# -eq 0 ]] && { QUIET=false; DRY_RUN=false; }
|
|
|
|
# Parse arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--dry-run) DRY_RUN=true ;;
|
|
--force) FORCE=true ;;
|
|
--verbose|-v) VERBOSE=true ;;
|
|
--help|-h)
|
|
echo "Usage: $0 [--dry-run] [--force] [--verbose] [--help]"
|
|
echo "Kill gr00t_wbc processes to prevent message passing conflicts"
|
|
exit 0 ;;
|
|
*) echo "Unknown option: $1"; exit 1 ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# Colors (only if not quiet)
|
|
if [[ "$QUIET" != true ]]; then
|
|
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
|
|
else
|
|
RED=''; GREEN=''; YELLOW=''; BLUE=''; NC=''
|
|
fi
|
|
|
|
# Show processes by pattern (for preview)
|
|
show_processes_by_pattern() {
|
|
local pattern="$1" desc="$2"
|
|
local pids=$(pgrep -f "$pattern" 2>/dev/null || true)
|
|
|
|
[[ -z "$pids" ]] && return 0
|
|
|
|
echo -e "${YELLOW}$desc processes:${NC}"
|
|
|
|
for pid in $pids; do
|
|
local cmd=$(ps -p $pid -o cmd= 2>/dev/null || echo "Process not found")
|
|
echo " PID $pid: $cmd"
|
|
done
|
|
}
|
|
|
|
# Kill processes by pattern (silent killing)
|
|
kill_by_pattern() {
|
|
local pattern="$1" desc="$2" signal="${3:-TERM}"
|
|
local pids=$(pgrep -f "$pattern" 2>/dev/null || true)
|
|
|
|
[[ -z "$pids" ]] && return 0
|
|
|
|
for pid in $pids; do
|
|
# Kill if not dry run
|
|
[[ "$DRY_RUN" != true ]] && kill -$signal $pid 2>/dev/null
|
|
done
|
|
}
|
|
|
|
# Show tmux sessions (for preview)
|
|
show_tmux() {
|
|
local pattern="$1"
|
|
local sessions=$(tmux list-sessions 2>/dev/null | grep "$pattern" | cut -d: -f1 || true)
|
|
|
|
[[ -z "$sessions" ]] && return 0
|
|
|
|
echo -e "${YELLOW}Tmux sessions:${NC}"
|
|
|
|
for session in $sessions; do
|
|
echo " Session: $session"
|
|
done
|
|
}
|
|
|
|
# Kill tmux sessions (silent killing)
|
|
kill_tmux() {
|
|
local pattern="$1"
|
|
local sessions=$(tmux list-sessions 2>/dev/null | grep "$pattern" | cut -d: -f1 || true)
|
|
|
|
[[ -z "$sessions" ]] && return 0
|
|
|
|
for session in $sessions; do
|
|
[[ "$DRY_RUN" != true ]] && tmux kill-session -t "$session" 2>/dev/null
|
|
done
|
|
}
|
|
|
|
# Show processes by port (for preview)
|
|
show_processes_by_port() {
|
|
local port="$1" desc="$2"
|
|
local pids=$(lsof -ti:$port 2>/dev/null || true)
|
|
|
|
[[ -z "$pids" ]] && return 0
|
|
|
|
echo -e "${YELLOW}$desc (port $port):${NC}"
|
|
|
|
for pid in $pids; do
|
|
local cmd=$(ps -p $pid -o cmd= 2>/dev/null || echo "Process not found")
|
|
echo " PID $pid: $cmd"
|
|
done
|
|
}
|
|
|
|
# Kill processes by port (silent killing)
|
|
kill_by_port() {
|
|
local port="$1" desc="$2"
|
|
local pids=$(lsof -ti:$port 2>/dev/null || true)
|
|
|
|
[[ -z "$pids" ]] && return 0
|
|
|
|
for pid in $pids; do
|
|
[[ "$DRY_RUN" != true ]] && kill -TERM $pid 2>/dev/null
|
|
done
|
|
}
|
|
|
|
# Check if any processes exist
|
|
has_processes() {
|
|
# Check for processes
|
|
local has_tmux=$(tmux list-sessions 2>/dev/null | grep "g1_deployment" || true)
|
|
local has_control=$(pgrep -f "run_g1_control_loop.py" 2>/dev/null || true)
|
|
local has_teleop=$(pgrep -f "run_teleop_policy_loop.py" 2>/dev/null || true)
|
|
local has_camera=$(pgrep -f "camera_forwarder.py" 2>/dev/null || true)
|
|
local has_rqt=$(pgrep -f "rqt.*image_view" 2>/dev/null || true)
|
|
local has_port=$(lsof -ti:5555 2>/dev/null || true)
|
|
|
|
[[ -n "$has_tmux" || -n "$has_control" || -n "$has_teleop" || -n "$has_camera" || -n "$has_rqt" || -n "$has_port" ]]
|
|
}
|
|
|
|
# Main execution
|
|
main() {
|
|
# Check if any processes exist first
|
|
if ! has_processes; then
|
|
# No processes to kill, exit silently
|
|
exit 0
|
|
fi
|
|
|
|
# Show header and processes to be killed
|
|
if [[ "$QUIET" != true ]]; then
|
|
echo -e "${BLUE}=== gr00t_wbc Process Killer ===${NC}"
|
|
[[ "$DRY_RUN" == true ]] && echo -e "${BLUE}=== DRY RUN MODE ===${NC}"
|
|
|
|
# Show what will be killed
|
|
show_tmux "g1_deployment"
|
|
show_processes_by_pattern "run_g1_control_loop.py" "G1 control loop"
|
|
show_processes_by_pattern "run_teleop_policy_loop.py" "Teleop policy"
|
|
show_processes_by_pattern "camera_forwarder.py" "Camera forwarder"
|
|
show_processes_by_pattern "rqt.*image_view" "RQT viewer"
|
|
show_processes_by_port "5555" "Inference server"
|
|
|
|
# Ask for confirmation
|
|
if [[ "$FORCE" != true && "$DRY_RUN" != true ]]; then
|
|
echo
|
|
echo -e "${RED}WARNING: This will terminate the above gr00t_wbc processes!${NC}"
|
|
read -p "Continue? [Y/n]: " -n 1 -r
|
|
echo
|
|
# Default to Y - only abort if user explicitly types 'n' or 'N'
|
|
[[ $REPLY =~ ^[Nn]$ ]] && { echo "Aborted."; exit 0; }
|
|
fi
|
|
echo
|
|
fi
|
|
|
|
# Kill processes (silently)
|
|
kill_tmux "g1_deployment"
|
|
kill_by_pattern "run_g1_control_loop.py" "G1 control loop"
|
|
kill_by_pattern "run_teleop_policy_loop.py" "Teleop policy"
|
|
kill_by_pattern "camera_forwarder.py" "Camera forwarder"
|
|
kill_by_pattern "rqt.*image_view" "RQT viewer"
|
|
kill_by_port "5555" "Inference server"
|
|
|
|
# Force kill remaining (SIGKILL)
|
|
[[ "$DRY_RUN" != true ]] && {
|
|
sleep 1
|
|
kill_by_pattern "run_g1_control_loop.py" "G1 control loop" "KILL"
|
|
kill_by_pattern "run_teleop_policy_loop.py" "Teleop policy" "KILL"
|
|
kill_by_pattern "camera_forwarder.py" "Camera forwarder" "KILL"
|
|
}
|
|
|
|
# Summary (unless quiet)
|
|
[[ "$QUIET" != true ]] && {
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|
echo -e "${BLUE}=== DRY RUN COMPLETE ===${NC}"
|
|
else
|
|
echo -e "${GREEN}All gr00t_wbc processes terminated${NC}"
|
|
fi
|
|
}
|
|
}
|
|
|
|
main "$@"
|