From 57b3ec0c927e637499a00c4943d8cd975a6379ce Mon Sep 17 00:00:00 2001 From: Arvin <62139570+wnlen@users.noreply.github.com> Date: Sat, 4 Jul 2026 21:41:22 +0800 Subject: [PATCH] Speed up controller failure path --- scripts/core/clashctl.sh | 14 +++++++++++--- scripts/core/proxy.sh | 16 +++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/scripts/core/clashctl.sh b/scripts/core/clashctl.sh index bc19603..5bf9009 100644 --- a/scripts/core/clashctl.sh +++ b/scripts/core/clashctl.sh @@ -196,6 +196,7 @@ print_on_feedback() { cmd_on() { local relay_switch local relay_switch_file relay_err_file relay_rc + local service_action="" local system_proxy_rc system_proxy_degraded="false" trap 'rc=$?; ui_error "开启代理失败:cmd_on 在第 ${LINENO} 行执行失败:${BASH_COMMAND}(返回码:${rc})"; ui_next "clashctl logs service"; exit "$rc"' ERR @@ -225,17 +226,24 @@ cmd_on() { if status_is_running 2>/dev/null && ! proxy_controller_reachable 2>/dev/null; then ui_warn "检测到内核已运行但控制器不可访问,正在重启以加载当前配置" + service_action="restart" service_restart || die_state "控制器启动失败:内核重启未完成" "clashctl logs mihomo" else + service_action="start" service_start || die_state "控制器启动失败:内核启动未完成" "clashctl logs mihomo" fi if ! wait_runtime_controller_ready 8; then - ui_warn "控制器未在预期时间内可访问,正在重启内核重试" - service_restart || die_state "控制器启动失败:内核重启未完成" "clashctl logs mihomo" - if ! wait_runtime_controller_ready 8; then + if [ "$service_action" = "restart" ] && [ "$(runtime_backend 2>/dev/null || true)" = "script" ]; then status_is_running 2>/dev/null || die_state "控制器启动失败:内核未运行" "clashctl logs mihomo" ui_warn "控制器暂不可访问,继续开启本地代理;请稍后执行 clashctl doctor" + else + ui_warn "控制器未在预期时间内可访问,正在重启内核重试" + service_restart || die_state "控制器启动失败:内核重启未完成" "clashctl logs mihomo" + if ! wait_runtime_controller_ready 8; then + status_is_running 2>/dev/null || die_state "控制器启动失败:内核未运行" "clashctl logs mihomo" + ui_warn "控制器暂不可访问,继续开启本地代理;请稍后执行 clashctl doctor" + fi fi fi diff --git a/scripts/core/proxy.sh b/scripts/core/proxy.sh index 995cb42..4442e0d 100644 --- a/scripts/core/proxy.sh +++ b/scripts/core/proxy.sh @@ -236,25 +236,35 @@ controller_curl() { local path="$2" local data="${3:-}" local base secret + local curl_args=() base="$(controller_api_base)" secret="$(controller_secret)" + if [ -n "${CLASH_CONTROLLER_CURL_CONNECT_TIMEOUT:-}" ]; then + curl_args+=(--connect-timeout "$CLASH_CONTROLLER_CURL_CONNECT_TIMEOUT") + fi + if [ -n "${CLASH_CONTROLLER_CURL_MAX_TIME:-}" ]; then + curl_args+=(--max-time "$CLASH_CONTROLLER_CURL_MAX_TIME") + fi + if [ -n "${data:-}" ]; then - curl -fsSL -X "$method" \ + curl "${curl_args[@]}" -fsSL -X "$method" \ -H "Content-Type: application/json" \ ${secret:+-H "Authorization: Bearer $secret"} \ --data "$data" \ "$base$path" else - curl -fsSL -X "$method" \ + curl "${curl_args[@]}" -fsSL -X "$method" \ ${secret:+-H "Authorization: Bearer $secret"} \ "$base$path" fi } proxy_controller_reachable() { - controller_curl GET "/version" >/dev/null 2>&1 + CLASH_CONTROLLER_CURL_CONNECT_TIMEOUT="${CLASH_CONTROLLER_REACHABLE_CONNECT_TIMEOUT:-1}" \ + CLASH_CONTROLLER_CURL_MAX_TIME="${CLASH_CONTROLLER_REACHABLE_MAX_TIME:-2}" \ + controller_curl GET "/version" >/dev/null 2>&1 } proxy_groups_json() {