显示
This commit is contained in:
132
install.sh
132
install.sh
@@ -81,7 +81,6 @@ detect_fastest_mirror() {
|
|||||||
# Ubuntu/Debian 镜像源列表
|
# Ubuntu/Debian 镜像源列表
|
||||||
UBUNTU_MIRRORS=(
|
UBUNTU_MIRRORS=(
|
||||||
"mirrors.tuna.tsinghua.edu.cn"
|
"mirrors.tuna.tsinghua.edu.cn"
|
||||||
"mirrors.ustc.edu.cn"
|
|
||||||
"mirrors.huaweicloud.com"
|
"mirrors.huaweicloud.com"
|
||||||
"mirrors.163.com"
|
"mirrors.163.com"
|
||||||
"archive.ubuntu.com"
|
"archive.ubuntu.com"
|
||||||
@@ -90,7 +89,6 @@ detect_fastest_mirror() {
|
|||||||
# CentOS/RHEL 镜像源列表
|
# CentOS/RHEL 镜像源列表
|
||||||
CENTOS_MIRRORS=(
|
CENTOS_MIRRORS=(
|
||||||
"mirrors.tuna.tsinghua.edu.cn"
|
"mirrors.tuna.tsinghua.edu.cn"
|
||||||
"mirrors.ustc.edu.cn"
|
|
||||||
"mirrors.huaweicloud.com"
|
"mirrors.huaweicloud.com"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -826,71 +824,73 @@ build_from_source() {
|
|||||||
sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOSUMDB=off" 2>/dev/null || true
|
sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOSUMDB=off" 2>/dev/null || true
|
||||||
sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOPRIVATE=*" 2>/dev/null || true
|
sudo bash -c "cd '$SOURCE_DIR' && $GO_PATH_ENV && go env -w GOPRIVATE=*" 2>/dev/null || true
|
||||||
|
|
||||||
# 使用后台进程显示实时进度
|
# 使用命名管道来实时监控输出
|
||||||
|
PIPE_FILE="/tmp/go_download_pipe_$$"
|
||||||
|
mkfifo "$PIPE_FILE" 2>/dev/null || true
|
||||||
|
|
||||||
|
# 后台进程显示实时进度
|
||||||
(
|
(
|
||||||
DOWNLOADED_COUNT=0
|
DOWNLOADED_COUNT=0
|
||||||
LAST_UPDATE_TIME=$(date +%s)
|
|
||||||
LAST_COUNT=0
|
LAST_COUNT=0
|
||||||
LAST_PACKAGE=""
|
LAST_PACKAGE=""
|
||||||
|
PACKAGES=()
|
||||||
|
|
||||||
while [ ! -f "${DOWNLOAD_PROGRESS_LOG}.done" ]; do
|
# 从管道读取输出并实时显示
|
||||||
sleep 1
|
while IFS= read -r line || [ -n "$line" ]; do
|
||||||
|
# 检查是否结束
|
||||||
# 统计已下载的包数量(从日志中统计)
|
if [ -f "${DOWNLOAD_PROGRESS_LOG}.done" ]; then
|
||||||
if [ -f "$DOWNLOAD_LOG" ]; then
|
break
|
||||||
CURRENT_COUNT=$(grep -c "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null || echo "0")
|
|
||||||
else
|
|
||||||
CURRENT_COUNT=0
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$CURRENT_COUNT" -gt "$LAST_COUNT" ]; then
|
# 检测下载消息
|
||||||
DOWNLOADED_COUNT=$CURRENT_COUNT
|
if echo "$line" | grep -q "go: downloading"; then
|
||||||
|
DOWNLOADED_COUNT=$((DOWNLOADED_COUNT + 1))
|
||||||
CURRENT_TIME=$(date +%s)
|
CURRENT_TIME=$(date +%s)
|
||||||
ELAPSED=$((CURRENT_TIME - DOWNLOAD_START_TIME))
|
ELAPSED=$((CURRENT_TIME - DOWNLOAD_START_TIME))
|
||||||
|
|
||||||
# 计算速度(每秒下载的包数)
|
# 提取包名
|
||||||
|
PACKAGE_NAME=$(echo "$line" | sed 's/go: downloading //' | cut -d' ' -f1)
|
||||||
|
if [ -n "$PACKAGE_NAME" ] && [ "$PACKAGE_NAME" != "$LAST_PACKAGE" ]; then
|
||||||
|
PACKAGES+=("$PACKAGE_NAME")
|
||||||
|
LAST_PACKAGE=$PACKAGE_NAME
|
||||||
|
|
||||||
|
# 计算速度
|
||||||
if [ "$ELAPSED" -gt 0 ]; then
|
if [ "$ELAPSED" -gt 0 ]; then
|
||||||
SPEED=$(echo "scale=2; $DOWNLOADED_COUNT / $ELAPSED" | bc 2>/dev/null || echo "0")
|
SPEED=$(echo "scale=2; $DOWNLOADED_COUNT / $ELAPSED" | bc 2>/dev/null || echo "0")
|
||||||
echo -ne "\r${BLUE}进度: 已下载 ${GREEN}${DOWNLOADED_COUNT}${NC} 个包 | 耗时: ${ELAPSED}秒 | 速度: ${GREEN}${SPEED}${NC} 包/秒"
|
else
|
||||||
|
SPEED="0"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
LAST_COUNT=$CURRENT_COUNT
|
# 显示进度(使用 \r 在同一行更新)
|
||||||
LAST_UPDATE_TIME=$CURRENT_TIME
|
echo -ne "\r${BLUE}进度: 已下载 ${GREEN}${DOWNLOADED_COUNT}${NC} 个包 | 耗时: ${ELAPSED}秒 | 速度: ${GREEN}${SPEED}${NC} 包/秒 | 当前: ${GREEN}${PACKAGE_NAME}${NC} "
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
done < "$PIPE_FILE" &
|
||||||
|
|
||||||
# 显示当前正在下载的包
|
# 等待主进程结束
|
||||||
if [ -f "$DOWNLOAD_LOG" ]; then
|
while [ ! -f "${DOWNLOAD_PROGRESS_LOG}.done" ]; do
|
||||||
CURRENT_PACKAGE=$(grep "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null | tail -1 | sed 's/go: downloading //' | cut -d' ' -f1)
|
sleep 0.5
|
||||||
if [ -n "$CURRENT_PACKAGE" ] && [ "$CURRENT_PACKAGE" != "$LAST_PACKAGE" ]; then
|
|
||||||
echo ""
|
|
||||||
echo -e "${BLUE} → 正在下载: ${GREEN}${CURRENT_PACKAGE}${NC}"
|
|
||||||
LAST_PACKAGE=$CURRENT_PACKAGE
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
) &
|
) &
|
||||||
PROGRESS_PID=$!
|
PROGRESS_PID=$!
|
||||||
|
|
||||||
# 使用 -json 格式下载,便于解析进度(同时输出到终端和文件)
|
# 使用 -x 标志下载,显示详细输出,同时写入日志和管道
|
||||||
if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -json" 2>&1 | tee "$DOWNLOAD_LOG"; then
|
if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -x" 2>&1 | tee "$DOWNLOAD_LOG" "$PIPE_FILE"; then
|
||||||
# 停止进度显示进程
|
# 停止进度显示进程
|
||||||
touch "${DOWNLOAD_PROGRESS_LOG}.done"
|
touch "${DOWNLOAD_PROGRESS_LOG}.done"
|
||||||
sleep 1
|
sleep 2
|
||||||
kill "$PROGRESS_PID" 2>/dev/null || true
|
kill "$PROGRESS_PID" 2>/dev/null || true
|
||||||
wait "$PROGRESS_PID" 2>/dev/null || true
|
wait "$PROGRESS_PID" 2>/dev/null || true
|
||||||
|
|
||||||
|
# 清理管道文件
|
||||||
|
rm -f "$PIPE_FILE" 2>/dev/null || true
|
||||||
|
|
||||||
DOWNLOAD_END_TIME=$(date +%s)
|
DOWNLOAD_END_TIME=$(date +%s)
|
||||||
DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME))
|
DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME))
|
||||||
|
|
||||||
# 统计下载信息(从 JSON 输出中解析)
|
# 统计下载信息(从输出中统计)
|
||||||
TOTAL_PACKAGES=$(grep -c '"Path":' "$DOWNLOAD_LOG" 2>/dev/null || echo "0")
|
|
||||||
SUCCESS_COUNT=$(grep -c '"Version":' "$DOWNLOAD_LOG" 2>/dev/null || echo "0")
|
|
||||||
|
|
||||||
# 如果没有 JSON 格式,尝试从普通输出统计
|
|
||||||
if [ "$TOTAL_PACKAGES" = "0" ]; then
|
|
||||||
TOTAL_PACKAGES=$(grep -c "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null || echo "0")
|
TOTAL_PACKAGES=$(grep -c "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null || echo "0")
|
||||||
SUCCESS_COUNT=$TOTAL_PACKAGES
|
SUCCESS_COUNT=$(grep -c "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null || echo "0")
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${GREEN}✓ 依赖下载完成${NC}"
|
echo -e "${GREEN}✓ 依赖下载完成${NC}"
|
||||||
@@ -906,16 +906,19 @@ build_from_source() {
|
|||||||
|
|
||||||
# 显示最后下载的几个包
|
# 显示最后下载的几个包
|
||||||
echo -e "${BLUE}最后下载的包:${NC}"
|
echo -e "${BLUE}最后下载的包:${NC}"
|
||||||
grep '"Path":' "$DOWNLOAD_LOG" | tail -10 | sed 's/.*"Path": "\([^"]*\)".*/ ✓ \1/' | while IFS= read -r line; do
|
grep "go: downloading" "$DOWNLOAD_LOG" 2>/dev/null | tail -10 | sed 's/go: downloading \([^ ]*\).*/ ✓ \1/' | while IFS= read -r line; do
|
||||||
echo "$line"
|
echo "$line"
|
||||||
done || true
|
done || true
|
||||||
else
|
else
|
||||||
# 停止进度显示进程
|
# 停止进度显示进程
|
||||||
touch "${DOWNLOAD_PROGRESS_LOG}.done"
|
touch "${DOWNLOAD_PROGRESS_LOG}.done"
|
||||||
sleep 1
|
sleep 2
|
||||||
kill "$PROGRESS_PID" 2>/dev/null || true
|
kill "$PROGRESS_PID" 2>/dev/null || true
|
||||||
wait "$PROGRESS_PID" 2>/dev/null || true
|
wait "$PROGRESS_PID" 2>/dev/null || true
|
||||||
|
|
||||||
|
# 清理管道文件
|
||||||
|
rm -f "$PIPE_FILE" 2>/dev/null || true
|
||||||
|
|
||||||
DOWNLOAD_EXIT_CODE=$?
|
DOWNLOAD_EXIT_CODE=$?
|
||||||
DOWNLOAD_END_TIME=$(date +%s)
|
DOWNLOAD_END_TIME=$(date +%s)
|
||||||
DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME))
|
DOWNLOAD_DURATION=$((DOWNLOAD_END_TIME - DOWNLOAD_START_TIME))
|
||||||
@@ -974,8 +977,55 @@ build_from_source() {
|
|||||||
) &
|
) &
|
||||||
PROGRESS_PID2=$!
|
PROGRESS_PID2=$!
|
||||||
|
|
||||||
|
# 重新创建管道
|
||||||
|
rm -f "$PIPE_FILE" 2>/dev/null || true
|
||||||
|
mkfifo "$PIPE_FILE" 2>/dev/null || true
|
||||||
|
|
||||||
|
# 重新启动进度显示
|
||||||
|
(
|
||||||
|
DOWNLOADED_COUNT=0
|
||||||
|
LAST_COUNT=0
|
||||||
|
LAST_PACKAGE=""
|
||||||
|
|
||||||
|
while IFS= read -r line || [ -n "$line" ]; do
|
||||||
|
if [ -f "${DOWNLOAD_PROGRESS_LOG}.done2" ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$line" | grep -q "go: downloading"; then
|
||||||
|
DOWNLOADED_COUNT=$((DOWNLOADED_COUNT + 1))
|
||||||
|
CURRENT_TIME=$(date +%s)
|
||||||
|
ELAPSED=$((CURRENT_TIME - DOWNLOAD_START_TIME))
|
||||||
|
|
||||||
|
PACKAGE_NAME=$(echo "$line" | sed 's/go: downloading //' | cut -d' ' -f1)
|
||||||
|
if [ -n "$PACKAGE_NAME" ] && [ "$PACKAGE_NAME" != "$LAST_PACKAGE" ]; then
|
||||||
|
LAST_PACKAGE=$PACKAGE_NAME
|
||||||
|
|
||||||
|
if [ "$ELAPSED" -gt 0 ]; then
|
||||||
|
SPEED=$(echo "scale=2; $DOWNLOADED_COUNT / $ELAPSED" | bc 2>/dev/null || echo "0")
|
||||||
|
else
|
||||||
|
SPEED="0"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -ne "\r${BLUE}进度: 已下载 ${GREEN}${DOWNLOADED_COUNT}${NC} 个包 | 耗时: ${ELAPSED}秒 | 速度: ${GREEN}${SPEED}${NC} 包/秒 | 当前: ${GREEN}${PACKAGE_NAME}${NC} "
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done < "$PIPE_FILE" &
|
||||||
|
|
||||||
|
while [ ! -f "${DOWNLOAD_PROGRESS_LOG}.done2" ]; do
|
||||||
|
sleep 0.5
|
||||||
|
done
|
||||||
|
) &
|
||||||
|
PROGRESS_PID2=$!
|
||||||
|
|
||||||
DOWNLOAD_START_TIME=$(date +%s)
|
DOWNLOAD_START_TIME=$(date +%s)
|
||||||
if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -json" > "$DOWNLOAD_LOG" 2>&1; then
|
if sudo bash -c "cd '$SOURCE_DIR' && $GO_ENV && timeout 600 go mod download -x" 2>&1 | tee "$DOWNLOAD_LOG" "$PIPE_FILE"; then
|
||||||
|
# 停止进度显示进程
|
||||||
|
touch "${DOWNLOAD_PROGRESS_LOG}.done2"
|
||||||
|
sleep 2
|
||||||
|
kill "$PROGRESS_PID2" 2>/dev/null || true
|
||||||
|
wait "$PROGRESS_PID2" 2>/dev/null || true
|
||||||
|
rm -f "$PIPE_FILE" 2>/dev/null || true
|
||||||
# 停止进度显示进程
|
# 停止进度显示进程
|
||||||
touch "$DOWNLOAD_PROGRESS_LOG.done2"
|
touch "$DOWNLOAD_PROGRESS_LOG.done2"
|
||||||
sleep 1
|
sleep 1
|
||||||
|
|||||||
Reference in New Issue
Block a user