From 80e04872d70e36b08e85abc5d30008cab7ff278d Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 17 Sep 2026 15:55:34 +0000 Subject: [PATCH] =?UTF-8?q?poda-fuentes:=20no=20corr=C3=ADa=20en=20takana?= =?UTF-8?q?=20=E2=80=94=20y=20la=20causa=20era=20que=20la=20caja=20NO=20TI?= =?UTF-8?q?ENE=20/dev/fd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El latido, corrido desde la caja, moría así: poda-fuentes.sh: line 72: /dev/fd/63: No such file or directory poda-fuentes.sh: line 73: viejos: unbound variable ⚠ poda de fuentes falló (rc=1) — sigo El segundo error es consecuencia del primero (el `mapfile` nunca corrió), y el primero no nombra la causa: **la sustitución de procesos de bash necesita `/dev/fd`, y una caja takana no lo tiene**. gioser sí: `/dev/fd -> /proc/self/fd`. O sea que NINGÚN `<(...)` de NINGÚN script del hub funcionaba allá — esto era sólo el primero en toparse. Dos arreglos, y los dos hacían falta: 1. En el script: `<(...)` fuera (fichero temporal, que anda en cualquier shell y con cualquier /dev) y `df -B1 --output=avail`, que es GNU, por `df -k` + awk. Es la poda de `work/sources`, justo lo que un hub necesita para no llenarse. 2. En la caja: `/dev/fd -> /proc/self/fd`, con una Card OneShot en el genesis para que sobreviva al reinicio (como la de `hostname`). Comprobado después: `bash -c "cat <(echo funciona)"` responde. Lo correcto a futuro es que lo haga el init o el product-rootfs, no una Card — queda anotado. Co-Authored-By: Claude Opus 5 (1M context) --- scripts/poda-fuentes.sh | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/scripts/poda-fuentes.sh b/scripts/poda-fuentes.sh index 551cdbba..a456bd49 100755 --- a/scripts/poda-fuentes.sh +++ b/scripts/poda-fuentes.sh @@ -68,8 +68,18 @@ MINUTOS=$((HORAS * 60)) poda() { local libre_antes libre_despues n - libre_antes=$(df -B1 --output=avail "$FUENTES" | tail -1) - mapfile -t viejos < <(find "$FUENTES" -mindepth 1 -maxdepth 1 -type d -mmin "+$MINUTOS" | sort) + # ⚠ `df -B1 --output=avail` es GNU y **busybox no lo tiene** (medido en la caja takana el + # 2026-09-17). `df -k` + awk da los mismos bytes y anda en los dos mundos. + libre_antes=$(df -k "$FUENTES" | tail -1 | awk '{print $4*1024}') + # ⚠ NADA DE `<(...)` ACÁ. La sustitución de procesos de bash necesita `/dev/fd`, y una caja + # takana **no lo tiene** (gioser sí: `/dev/fd -> /proc/self/fd`). El síntoma no nombra la causa: + # `line 72: /dev/fd/63: No such file or directory` y después `viejos: unbound variable`, porque el + # `mapfile` nunca corrió. Un fichero temporal anda en cualquier shell y en cualquier /dev. + local lista; lista=$(mktemp) + find "$FUENTES" -mindepth 1 -maxdepth 1 -type d -mmin "+$MINUTOS" | sort > "$lista" + viejos=() + while IFS= read -r _l; do [ -n "$_l" ] && viejos+=("$_l"); done < "$lista" + rm -f "$lista" n=${#viejos[@]} local quedan quedan=$(find "$FUENTES" -mindepth 1 -maxdepth 1 -type d -not -mmin "+$MINUTOS" | wc -l) @@ -89,7 +99,7 @@ poda() { fi printf '%s\0' "${viejos[@]}" | xargs -0 -r rm -rf - libre_despues=$(df -B1 --output=avail "$FUENTES" | tail -1) + libre_despues=$(df -k "$FUENTES" | tail -1 | awk '{print $4*1024}') echo " borrados $n · libres $(gigas "$libre_despues") G · LIBERADO $(gigas $((libre_despues - libre_antes))) G" }