poda-fuentes: no corría en takana — y la causa era que la caja NO TIENE /dev/fd
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) <noreply@anthropic.com>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +13 −3
- scripts/poda-fuentes.sh +13 −3
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"
}