diff --git a/hy2.sh b/hy2.sh index 1c8abad..1b52298 100644 --- a/hy2.sh +++ b/hy2.sh @@ -66,18 +66,50 @@ get_public_ips() { printf '%s|%s\n' "$ipv4" "$ipv6" } +wait_for_apt_lock() { + local timeout="${1:-300}" + local waited=0 + + while pgrep -x apt >/dev/null 2>&1 \ + || pgrep -x apt-get >/dev/null 2>&1 \ + || pgrep -x dpkg >/dev/null 2>&1 \ + || pgrep -f unattended-upgrades >/dev/null 2>&1; do + if (( waited == 0 )); then + yellow "检测到 APT/DPKG 正被其他进程占用,正在等待..." + ps -ef | grep -E 'apt|apt-get|dpkg|unattended' | grep -v grep || true + fi + + if (( waited >= timeout )); then + red "等待 APT 锁超时(${timeout} 秒)。" + if confirm_yn "是否继续等待?"; then + waited=0 + else + return 1 + fi + fi + + sleep 2 + waited=$((waited + 2)) + done + + return 0 +} + apt_update_and_install_base() { - if ! confirm_yn "即将执行 apt update 并安装基础依赖 curl sed ufw jq openssl,是否继续?"; then + if ! confirm_yn "即将执行 apt update 并安装基础依赖 curl sed ufw openssl,是否继续?"; then red "已取消。" exit 1 fi - blue "==> 更新 APT 软件库" export DEBIAN_FRONTEND=noninteractive + + blue "==> 更新 APT 软件库" + wait_for_apt_lock 300 || { red "APT 被占用,无法继续。"; exit 1; } apt update -y blue "==> 安装基础依赖" - apt install -y curl sed ufw jq openssl + wait_for_apt_lock 300 || { red "APT 被占用,无法继续。"; exit 1; } + apt install -y curl sed ufw openssl } disable_existing_firewalls() {