diff --git a/tools/dryrun.sh b/tools/dryrun.sh index 8ca1b53a..2debd3cb 100755 --- a/tools/dryrun.sh +++ b/tools/dryrun.sh @@ -22,10 +22,13 @@ get_open_trades_pairs() { echo "${pairs[@]}" } -# 2. 从远程接口获取币对列表 +# 2. 从远程接口获取币对列表(带重试机制) get_remote_pairs() { local remote_url="$1" local pairs=() + local max_retries=5 + local retry_delay=3 + local attempt=1 if [ -z "$remote_url" ]; then echo "⚠️ 未提供远程币对列表URL,远程币对列表为空" >&2 @@ -33,30 +36,44 @@ get_remote_pairs() { return fi - echo "正在从远程URL获取币对列表: $remote_url" >&2 - local pairs_json=$(curl -s "$remote_url") + # 重试循环 + while [ $attempt -le $max_retries ]; do + echo "正在从远程URL获取币对列表 (尝试 $attempt/$max_retries): $remote_url" >&2 + local pairs_json=$(curl -s "$remote_url") - if [ $? -ne 0 ] || [ -z "$pairs_json" ]; then - echo "⚠️ 远程币对列表获取失败,使用空列表" >&2 - echo "" - return - fi - - local parsed_pairs=$(echo "$pairs_json" | python3 -c " + if [ $? -eq 0 ] && [ -n "$pairs_json" ]; then + # curl 成功且有返回内容,尝试解析 + local parsed_pairs=$(echo "$pairs_json" | python3 -c " import sys, json -data = json.load(sys.stdin) -pairs = [pair.replace('-', '/') for pair in data.get('pairlist', [])] -print(' '.join(pairs) if pairs else '') +try: + data = json.load(sys.stdin) + pairs = [pair.replace('-', '/') for pair in data.get('pairlist', [])] + print(' '.join(pairs) if pairs else '') +except: + pass ") - if [ -n "$parsed_pairs" ]; then - pairs=($parsed_pairs) - echo "从远程获取到币对: ${pairs[*]}" >&2 - else - echo "⚠️ 远程币对列表解析为空" >&2 - fi + if [ -n "$parsed_pairs" ]; then + pairs=($parsed_pairs) + echo "✓ 从远程成功获取到币对: ${pairs[*]}" >&2 + echo "${pairs[*]}" + return 0 + fi + fi - echo "${pairs[@]}" + # 如果不是最后一次尝试,等待后重试 + if [ $attempt -lt $max_retries ]; then + echo "⚠️ 获取失败,${retry_delay}秒后重试..." >&2 + sleep $retry_delay + fi + + attempt=$((attempt + 1)) + done + + # 所有重试都失败 + echo "✗ 远程币对列表获取失败(已重试${max_retries}次),使用空列表" >&2 + echo "" + return 1 } # 3. 合并并去重两个币对列表 diff --git a/tools/live.sh b/tools/live.sh index 75b894da..b6b0553a 100755 --- a/tools/live.sh +++ b/tools/live.sh @@ -78,10 +78,13 @@ validate_json_file() { fi } -# 3. 从远程URL获取币对列表 +# 3. 从远程URL获取币对列表(带重试机制) get_remote_pairs() { local remote_url="$1" local pairs=() + local max_retries=5 + local retry_delay=3 + local attempt=1 if [ -z "$remote_url" ]; then echo "⚠️ 未提供远程币对列表URL,远程币对列表为空" >&2 @@ -89,30 +92,44 @@ get_remote_pairs() { return fi - echo "正在从远程URL获取币对列表: $remote_url" >&2 - local pairs_json=$(curl -s "$remote_url") + # 重试循环 + while [ $attempt -le $max_retries ]; do + echo "正在从远程URL获取币对列表 (尝试 $attempt/$max_retries): $remote_url" >&2 + local pairs_json=$(curl -s "$remote_url") - if [ $? -ne 0 ] || [ -z "$pairs_json" ]; then - echo "⚠️ 远程币对列表获取失败,使用空列表" >&2 - echo "" - return - fi - - local parsed_pairs=$(echo "$pairs_json" | python3 -c " + if [ $? -eq 0 ] && [ -n "$pairs_json" ]; then + # curl 成功且有返回内容,尝试解析 + local parsed_pairs=$(echo "$pairs_json" | python3 -c " import sys, json -data = json.load(sys.stdin) -pairs = [pair.replace('-', '/') for pair in data.get('pairlist', [])] -print(' '.join(pairs) if pairs else '') +try: + data = json.load(sys.stdin) + pairs = [pair.replace('-', '/') for pair in data.get('pairlist', [])] + print(' '.join(pairs) if pairs else '') +except: + pass ") - if [ -n "$parsed_pairs" ]; then - pairs=($parsed_pairs) - echo "从远程获取到币对: ${pairs[*]}" >&2 - else - echo "⚠️ 远程币对列表解析为空" >&2 - fi + if [ -n "$parsed_pairs" ]; then + pairs=($parsed_pairs) + echo "✓ 从远程成功获取到币对: ${pairs[*]}" >&2 + echo "${pairs[*]}" + return 0 + fi + fi - echo "${pairs[@]}" + # 如果不是最后一次尝试,等待后重试 + if [ $attempt -lt $max_retries ]; then + echo "⚠️ 获取失败,${retry_delay}秒后重试..." >&2 + sleep $retry_delay + fi + + attempt=$((attempt + 1)) + done + + # 所有重试都失败 + echo "✗ 远程币对列表获取失败(已重试${max_retries}次),使用空列表" >&2 + echo "" + return 1 } # 4. 合并并去重多个币对列表