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