mirror of
https://github.com/fscarmen/sing-box.git
synced 2026-08-10 17:55:16 +08:00
refactor: improve stability https://github.com/fscarmen/sing-box/issues/286
- fix cleanup exit flow by separating interrupt exit from normal exit - add timeout fallback for CDN detection to prevent hanging - Test GitHub CDN using `api.github.com`, and remove proxies that are unreachable. 重构: 提升稳定性 - 修复退出清理流程,分离中断退出与正常退出 - 为 CDN 检测增加超时回退,避免脚本卡死 - 测试 Github CDN 改为 api.github.com,去掉若干不能连接的代理
This commit is contained in:
+41
-13
@@ -4,7 +4,7 @@
|
|||||||
VERSION='v1.3.6 (2026.03.22)'
|
VERSION='v1.3.6 (2026.03.22)'
|
||||||
|
|
||||||
# Github 反代加速代理
|
# Github 反代加速代理
|
||||||
GITHUB_PROXY=('https://v6.gh-proxy.org/' 'https://gh-proxy.com/' 'https://hub.glowp.xyz/' 'https://proxy.vvvv.ee/' 'https://ghproxy.lvedong.eu.org/')
|
GITHUB_PROXY=('https://hub.glowp.xyz/' 'https://proxy.vvvv.ee/')
|
||||||
|
|
||||||
# 各变量默认值
|
# 各变量默认值
|
||||||
TEMP_DIR='/tmp/sing-box'
|
TEMP_DIR='/tmp/sing-box'
|
||||||
@@ -26,9 +26,20 @@ TOTAL_STEPS='' # 总步骤数(协议确定后动态计算)
|
|||||||
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
trap "wait 2>/dev/null; rm -rf $TEMP_DIR >/dev/null 2>&1; echo -e '\n'; exit" INT QUIT TERM EXIT
|
cleanup_temp() {
|
||||||
|
rm -rf "$TEMP_DIR"
|
||||||
|
}
|
||||||
|
|
||||||
mkdir -p $TEMP_DIR
|
on_interrupt_exit() {
|
||||||
|
cleanup_temp
|
||||||
|
echo -e '\n'
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
trap cleanup_temp EXIT
|
||||||
|
trap on_interrupt_exit INT QUIT TERM
|
||||||
|
|
||||||
|
mkdir -p "$TEMP_DIR"
|
||||||
|
|
||||||
E[0]="Language:\n 1. English (default) \n 2. 简体中文"
|
E[0]="Language:\n 1. English (default) \n 2. 简体中文"
|
||||||
C[0]="${E[0]}"
|
C[0]="${E[0]}"
|
||||||
@@ -351,27 +362,44 @@ calc_install_steps() {
|
|||||||
TOTAL_STEPS=$_total
|
TOTAL_STEPS=$_total
|
||||||
}
|
}
|
||||||
|
|
||||||
# 检测是否需要启用 Github CDN,如能直接连通,则不使用
|
# 检测是否需要启用 Github CDN,如能直接连通 api.github.com,则不使用
|
||||||
check_cdn() {
|
check_cdn() {
|
||||||
local PROXY
|
local PROXY CODE PID
|
||||||
|
local _WAIT_COUNT=120
|
||||||
|
local PIDS=()
|
||||||
|
local API_URL='https://api.github.com/repos/SagerNet/sing-box/releases'
|
||||||
|
|
||||||
for PROXY in "" "${GITHUB_PROXY[@]}"; do
|
CODE=$(wget --no-check-certificate -qT3 -O /dev/null --server-response "$API_URL" 2>&1 | awk '/HTTP\//{code=$2} END{print code}')
|
||||||
|
if [ "$CODE" = '200' ]; then
|
||||||
|
GH_PROXY=''
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
for PROXY in "${GITHUB_PROXY[@]}"; do
|
||||||
{
|
{
|
||||||
local CODE=$(wget -qT5 -O /dev/null --server-response "${PROXY}https://raw.githubusercontent.com/fscarmen/sing-box/main/sing-box.sh" 2>&1 | awk '/HTTP\//{code=$2} END{print code}')
|
CODE=$(wget --no-check-certificate -qT3 -O /dev/null --server-response "${PROXY}${API_URL}" 2>&1 | awk '/HTTP\//{code=$2} END{print code}')
|
||||||
[ "$CODE" = "200" ] && [ ! -s "${TEMP_DIR}/cdn_proxy" ] && echo "$PROXY" > "${TEMP_DIR}/cdn_proxy"
|
[ "$CODE" = '200' ] && [ ! -e "${TEMP_DIR}/cdn_proxy" ] && printf '%s' "$PROXY" > "${TEMP_DIR}/cdn_proxy"
|
||||||
} &
|
} &
|
||||||
|
PIDS+=("$!")
|
||||||
done
|
done
|
||||||
|
|
||||||
# 等第一个成功
|
# 等第一个返回 200 的代理,超时则回退为直连,避免无限等待卡死
|
||||||
while [ ! -s "${TEMP_DIR}/cdn_proxy" ]; do
|
while [ ! -e "${TEMP_DIR}/cdn_proxy" ] && [ "$_WAIT_COUNT" -gt 0 ]; do
|
||||||
sleep 0.05
|
sleep 0.05
|
||||||
|
(( _WAIT_COUNT-- )) || true
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ -e "${TEMP_DIR}/cdn_proxy" ]; then
|
||||||
GH_PROXY=$(cat "${TEMP_DIR}/cdn_proxy")
|
GH_PROXY=$(cat "${TEMP_DIR}/cdn_proxy")
|
||||||
|
else
|
||||||
|
GH_PROXY=''
|
||||||
|
fi
|
||||||
|
|
||||||
# 清理后台任务和临时文件
|
# 清理后台任务和临时文件,避免 wait 被慢连接拖住
|
||||||
rm -rf "${TEMP_DIR}/cdn_proxy"
|
for PID in "${PIDS[@]}"; do
|
||||||
wait 2>/dev/null
|
kill "$PID" >/dev/null 2>&1 || true
|
||||||
|
done
|
||||||
|
rm -f "${TEMP_DIR}/cdn_proxy"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 检测是否解锁 chatGPT,以决定是否使用 warp 链式代理或者是 direct out,此处判断改编自 https://github.com/lmc999/RegionRestrictionCheck
|
# 检测是否解锁 chatGPT,以决定是否使用 warp 链式代理或者是 direct out,此处判断改编自 https://github.com/lmc999/RegionRestrictionCheck
|
||||||
|
|||||||
Reference in New Issue
Block a user