





























@@ -1647,19 +1647,40 @@ function remoteAwsMacosJsBootstrap({ packageManager = false } = {}) {
16471647'if [ ! -d "$TMPDIR" ]; then mkdir -p "$TMPDIR" 2>/dev/null || export TMPDIR="/tmp"; fi;',
16481648'if [ ! -d "$TMPDIR" ]; then echo "usable TMPDIR not found: $TMPDIR" >&2; return 1; fi;',
16491649'node_dir="$tool_root/node-v${node_version}-darwin-${node_arch}";',
1650+'ready_marker="$node_dir/.openclaw-crabbox-node-ready";',
16501651'export PATH="$node_dir/bin:$PATH";',
1651-'if [ ! -x "$node_dir/bin/node" ]; then',
1652-'tmp_dir="$(mktemp -d)" || return 1;',
1652+'if [ ! -x "$node_dir/bin/node" ] || [ ! -f "$ready_marker" ]; then',
1653+'mkdir -p "$tool_root" || { status=$?; return "$status"; };',
1654+'install_lock="$tool_root/.node-${node_version}-${node_arch}.lock";',
1655+"lock_acquired=0;",
1656+'lock_deadline=$((SECONDS + 300));',
1657+"while true; do",
1658+'if mkdir "$install_lock" 2>/dev/null; then lock_acquired=1; printf "%s\\n" "$$" >"$install_lock/pid" || { status=$?; rm -rf "$install_lock"; return "$status"; }; break; fi;',
1659+'if [ -x "$node_dir/bin/node" ] && [ -f "$ready_marker" ]; then break; fi;',
1660+'if [ "$SECONDS" -ge "$lock_deadline" ]; then',
1661+'lock_pid="$(cat "$install_lock/pid" 2>/dev/null || true)";',
1662+'if [ -n "$lock_pid" ] && kill -0 "$lock_pid" 2>/dev/null; then echo "timed out waiting for active macOS Node toolchain install lock: $install_lock pid=$lock_pid" >&2; return 1; fi;',
1663+'echo "reclaiming stale macOS Node toolchain install lock: $install_lock" >&2;',
1664+'rm -rf "$install_lock" || return 1;',
1665+'lock_deadline=$((SECONDS + 300));',
1666+"fi;",
1667+"sleep 1;",
1668+"done;",
1669+"release_install_lock() { if [ \"$lock_acquired\" = \"1\" ]; then rm -rf \"$install_lock\" 2>/dev/null || true; fi; };",
1670+'if [ ! -x "$node_dir/bin/node" ] || [ ! -f "$ready_marker" ]; then',
1671+'tmp_dir="$(mktemp -d)" || { release_install_lock; return 1; };',
16531672'pkg="node-v${node_version}-darwin-${node_arch}.tar.gz";',
16541673'base_url="https://nodejs.org/dist/v${node_version}";',
1655-'mkdir -p "$tool_root" || { status=$?; rm -rf "$tmp_dir"; return "$status"; };',
1656-'curl -fsSLo "$tmp_dir/$pkg" "$base_url/$pkg" || { status=$?; rm -rf "$tmp_dir"; return "$status"; };',
1657-'curl -fsSLo "$tmp_dir/SHASUMS256.txt" "$base_url/SHASUMS256.txt" || { status=$?; rm -rf "$tmp_dir"; return "$status"; };',
1658-'(cd "$tmp_dir" && grep " $pkg$" SHASUMS256.txt | shasum -a 256 -c -) || { status=$?; rm -rf "$tmp_dir"; return "$status"; };',
1659-'rm -rf "$node_dir" || { status=$?; rm -rf "$tmp_dir"; return "$status"; };',
1660-'tar -xzf "$tmp_dir/$pkg" -C "$tool_root" || { status=$?; rm -rf "$tmp_dir"; return "$status"; };',
1674+'curl -fsSLo "$tmp_dir/$pkg" "$base_url/$pkg" || { status=$?; release_install_lock; rm -rf "$tmp_dir"; return "$status"; };',
1675+'curl -fsSLo "$tmp_dir/SHASUMS256.txt" "$base_url/SHASUMS256.txt" || { status=$?; release_install_lock; rm -rf "$tmp_dir"; return "$status"; };',
1676+'(cd "$tmp_dir" && grep " $pkg$" SHASUMS256.txt | shasum -a 256 -c -) || { status=$?; release_install_lock; rm -rf "$tmp_dir"; return "$status"; };',
1677+'rm -rf "$node_dir" || { status=$?; release_install_lock; rm -rf "$tmp_dir"; return "$status"; };',
1678+'tar -xzf "$tmp_dir/$pkg" -C "$tool_root" || { status=$?; release_install_lock; rm -rf "$tmp_dir"; return "$status"; };',
1679+'touch "$ready_marker" || { status=$?; release_install_lock; rm -rf "$tmp_dir"; return "$status"; };',
16611680'rm -rf "$tmp_dir";',
16621681"fi;",
1682+"release_install_lock;",
1683+"fi;",
16631684"node --version >&2 || return 1;",
16641685"openclaw_crabbox_env() {",
16651686"openclaw_env_args=();",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。