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>
This commit is contained in:
Sergio
2026-09-17 15:56:04 +00:00
co-authored by Claude Opus 5
parent 42eb135328
commit 80e04872d7
+13 -3
View File
@@ -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"
}