#!/usr/bin/env bash # 停止本项目所有进程(主程序 + 进程池worker + ffmpeg子进程 + coscli)。 # 用法: bash stop.sh 普通停止 # bash stop.sh -y 不确认直接停 set -u echo "==> 即将停止的进程:" ps -eo pid,etime,rss,args 2>/dev/null | grep -E "main\.py|run_worker\.py|multiprocessing|forkserver|[f]fmpeg|[c]oscli" | grep -v grep | grep -v "stop.sh" || echo " (没找到运行中的进程)" echo "" if [ "${1:-}" != "-y" ]; then read -r -p "确认全部杀掉? [y/N] " ans case "$ans" in y|Y) ;; *) echo "已取消"; exit 0 ;; esac fi echo "==> 1. 杀主程序 + 进程池worker" pkill -9 -f "main.py" 2>/dev/null && echo " ✓ main.py" pkill -9 -f "run_worker.py" 2>/dev/null && echo " ✓ run_worker.py" pkill -9 -f "multiprocessing" 2>/dev/null && echo " ✓ multiprocessing worker" pkill -9 -f "forkserver" 2>/dev/null && echo " ✓ forkserver" echo "==> 2. 杀 ffmpeg 子进程(不会自动死, 必须单独杀, 否则占GPU/CPU)" pkill -9 ffmpeg 2>/dev/null && echo " ✓ ffmpeg" pkill -9 ffprobe 2>/dev/null && echo " ✓ ffprobe" echo "==> 3. 杀残留 coscli(正在传输的)" pkill -9 -f "coscli" 2>/dev/null && echo " ✓ coscli" sleep 1 echo "" echo "==> 检查残留:" LEFT=$(ps -eo pid,args 2>/dev/null | grep -E "main\.py|run_worker\.py|multiprocessing|forkserver|[f]fmpeg|[c]oscli" | grep -v grep | grep -v "stop.sh") if [ -z "$LEFT" ]; then echo " ✓ 全部已停止" else echo " ⚠️ 仍有残留, 再杀一次:" echo "$LEFT" echo "$LEFT" | awk '{print $1}' | xargs -r kill -9 2>/dev/null echo " 已强制杀掉" fi # 可选: 看GPU是否释放 if command -v nvidia-smi >/dev/null 2>&1; then echo "" echo "==> GPU 占用(确认ffmpeg/whisper已释放):" nvidia-smi --query-gpu=index,memory.used,utilization.gpu --format=csv,noheader 2>/dev/null fi echo "" echo "停止完成。重启: bash scripts/启动.sh 30"