gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1184Shell 70Rust 62Markdown 501503 Definitions

⎇ main scripts/lib/subir-fds.sh Shell · 42 lines · 2.5 KB History raw

fix(granja): el límite de fds vivía en UN llamador, y la campaña manual no lo tenía 24fa7ec83 · Sergio ·

1# subir-fds.sh — sube el límite BLANDO de descriptores antes de construir. Se hace `source`.
2#
3# ══ POR QUÉ ESTO ES UNA LIBRERÍA Y NO UNA LÍNEA EN CADA GUION ══════════════════════════════════
4# El 2026-10-11 se midió en el worker que `obs-studio` y `spectacle` fallaban las dos con
5#
6#     error: failed to open object libavcodec/x86/rv34dsp_init.o: ProcessFdQuotaExceeded
7#
8# y no era ffmpeg: **libavcodec tiene 1.093 ficheros `.o` y el límite blando era 1024**. El
9# enlazador los abre a la vez y se pasa por 69. El límite DURO es 524288, así que subirlo no
10# necesita privilegios — nadie lo había subido porque 1024 alcanza para todo lo demás del corpus.
11#
12# Se arregló **sólo en `farm-worker-loop.sh`**, y ahí quedó el hueco: el 2026-10-19 una campaña
13# manual de 25 recetas perdió `pata-centro` y `pata-llimphi` con
14#
15#     error: unable to search for static library '…/libmemchr-….rlib': ProcessFdQuotaExceeded
16#
17# o sea el MISMO límite por el otro camino. El bucle del worker lo subía; la tanda lanzada a mano
18# no, porque `campana-deuda.sh` —el guion oficial de campañas— tampoco lo hacía. Un arreglo que
19# vive en un solo llamador es un arreglo que el siguiente llamador no tiene.
20#
21# ⚠ **Y SE LEE COMO RECETA ROTA.** Es el tercer miembro de la misma familia y conviene verlos
22# juntos: **bytes** (disco lleno ⇒ ✗ en recetas sanas), **inodos** (`df -h` al 90 % y cero inodos ⇒
23# «0 fallan» mentiroso) y **fds**. Los tres son límites de la MÁQUINA que el informe presenta como
24# defecto de la RECETA, y los tres cuestan el mismo rato: alguien abre el `.toml` a buscar un bug
25# que no está ahí.
26#
27# Uso:  . "$(dirname "$0")/../lib/subir-fds.sh"   # y después:  subir_fds
28subir_fds() {
29    _sf_quiero=${1:-65536}
30    _sf_duro=$(ulimit -Hn 2>/dev/null) || return 0
31    _sf_blando=$(ulimit -Sn 2>/dev/null) || return 0
32    [ "$_sf_duro" = "unlimited" ] && _sf_duro=$_sf_quiero
33    # No pedir más que el duro: `ulimit -n` por encima del duro falla y dejaría el blando como
34    # estaba, en silencio.
35    [ "$_sf_quiero" -gt "$_sf_duro" ] 2>/dev/null && _sf_quiero=$_sf_duro
36    if [ "$_sf_blando" -lt "$_sf_quiero" ] 2>/dev/null; then
37        # Se DICE lo que se hizo: un límite que cambia en silencio es un límite que nadie sabe que
38        # existe hasta que vuelve a estorbar.
39        ulimit -n "$_sf_quiero" 2>/dev/null \
40            && echo "==> fds: límite blando $_sf_blando → $_sf_quiero (duro: $_sf_duro)"
41    fi
42}