@@ -39,6 +39,7 @@ WAIT_PORTS_SCRIPT="${SCRIPT_DIR}/wait_shard_worker_ports.py"
3939SHARD_TEST_SCRIPT=" ${SCRIPT_DIR} /shard_test_worker.py"
4040DETECT_REDIS_SCRIPT=" ${SCRIPT_DIR} /detect_shard_redis.py"
4141PORT_RELEASE_TIMEOUT=" ${PALLAS_SHARD_PORT_RELEASE_TIMEOUT:- 60} "
42+ FORCE_STOP=0
4243PID_WORKER_TEST=" ${RUN_DIR} /worker-test.pid"
4344TEST_SHARD_ID=" ${PALLAS_SHARD_TEST_ID:- 99} "
4445
@@ -96,6 +97,7 @@ usage() {
9697 --workers-only 仅操作生产 worker(不停/不启 hub;start 时只拉起缺失进程,restart 时全量重启)
9798 --scale-only 扩容模式:不重分配端口、不同步协议端 ws_url(已有 worker 在跑时 start --workers-only 自动启用)
9899 --hub-only 仅操作 hub 控制台(不停/不启 worker;restart 时常用)
100+ --force stop/restart 时 SIGKILL 强杀并跳过端口长等待(加快重启)
99101 --dry-run 只显示将要执行的命令,不真正启动
100102 -h, --help 显示本帮助
101103
@@ -330,6 +332,13 @@ stop_one() {
330332 fi
331333 local pid
332334 pid=" $( cat " ${pidfile} " ) "
335+ if [[ " ${FORCE_STOP} " -eq 1 ]]; then
336+ kill -KILL " ${pid} " 2> /dev/null || true
337+ pkill -KILL -P " ${pid} " 2> /dev/null || true
338+ rm -f " ${pidfile} "
339+ echo " · ${label} :已强制停止"
340+ return 0
341+ fi
333342 kill -TERM " ${pid} " 2> /dev/null || true
334343 local i=0
335344 while kill -0 " ${pid} " 2> /dev/null && [[ " ${i} " -lt 30 ]]; do
@@ -338,6 +347,7 @@ stop_one() {
338347 done
339348 if kill -0 " ${pid} " 2> /dev/null; then
340349 kill -KILL " ${pid} " 2> /dev/null || true
350+ pkill -KILL -P " ${pid} " 2> /dev/null || true
341351 fi
342352 rm -f " ${pidfile} "
343353 echo " · ${label} :已停止"
@@ -347,8 +357,15 @@ stop_one() {
347357stop_orphan_shard_processes () {
348358 local pat
349359 for pat in " ${REPO_ROOT} /.venv/bin/python3 bot_hub.py" " ${REPO_ROOT} /.venv/bin/python3 bot_worker.py" ; do
350- pkill -TERM -f " ${pat} " 2> /dev/null || true
360+ if [[ " ${FORCE_STOP} " -eq 1 ]]; then
361+ pkill -KILL -f " ${pat} " 2> /dev/null || true
362+ else
363+ pkill -TERM -f " ${pat} " 2> /dev/null || true
364+ fi
351365 done
366+ if [[ " ${FORCE_STOP} " -eq 1 ]]; then
367+ return 0
368+ fi
352369 sleep 1
353370 for pat in " ${REPO_ROOT} /.venv/bin/python3 bot_hub.py" " ${REPO_ROOT} /.venv/bin/python3 bot_worker.py" ; do
354371 pkill -KILL -f " ${pat} " 2> /dev/null || true
@@ -357,13 +374,21 @@ stop_orphan_shard_processes() {
357374
358375stop_orphan_worker_processes () {
359376 local pat=" ${REPO_ROOT} /.venv/bin/python3 bot_worker.py"
377+ if [[ " ${FORCE_STOP} " -eq 1 ]]; then
378+ pkill -KILL -f " ${pat} " 2> /dev/null || true
379+ return 0
380+ fi
360381 pkill -TERM -f " ${pat} " 2> /dev/null || true
361382 sleep 1
362383 pkill -KILL -f " ${pat} " 2> /dev/null || true
363384}
364385
365386stop_orphan_hub_processes () {
366387 local pat=" ${REPO_ROOT} /.venv/bin/python3 bot_hub.py"
388+ if [[ " ${FORCE_STOP} " -eq 1 ]]; then
389+ pkill -KILL -f " ${pat} " 2> /dev/null || true
390+ return 0
391+ fi
367392 pkill -TERM -f " ${pat} " 2> /dev/null || true
368393 sleep 1
369394 pkill -KILL -f " ${pat} " 2> /dev/null || true
@@ -482,6 +507,11 @@ count_running_production_worker_ids() {
482507
483508wait_worker_ports_released () {
484509 local workers=" $1 "
510+ if [[ " ${FORCE_STOP} " -eq 1 ]]; then
511+ echo " · worker 端口:强制模式,短等待 3s"
512+ sleep 3
513+ return 0
514+ fi
485515 if [[ " ${DRY_RUN} " -eq 1 ]]; then
486516 echo " · worker 端口:将等待释放后再启动(预览)"
487517 return 0
@@ -1024,7 +1054,7 @@ cmd_stop() {
10241054 echo " 生产 worker 已处理完毕(测试 worker-test 未停止)。"
10251055 return 0
10261056 fi
1027- print_title " Pallas-Bot 分片模式 · 停止"
1057+ print_title " Pallas-Bot 分片模式 · 停止$( [[ " ${FORCE_STOP} " -eq 1 ]] && echo ' (强制) ' ) "
10281058 stop_one " worker-test" " 测试 worker-test"
10291059 stop_production_workers
10301060 stop_hub_process
@@ -1345,6 +1375,10 @@ while [[ $# -gt 0 ]]; do
13451375 HUB_ONLY=1
13461376 shift
13471377 ;;
1378+ --force)
1379+ FORCE_STOP=1
1380+ shift
1381+ ;;
13481382 -h|--help)
13491383 usage
13501384 exit 0
0 commit comments