# cronie 1.7.2 — el disparador periódico. Es la tercera y última de las raíces que `targets.toml` # declaraba para el perfil `servidor` sin receta detrás. El motivo escrito allí es directo: en una # distro sin systemd no hay timers, y el latido de la granja son tres líneas de crontab. # # **Y busybox YA trae un `crond` — esto no lo reemplaza por reflejo.** El artefacto sellado de # busybox pone `crond` en `/sbin`. Lo que cronie agrega y busybox no tiene: `@reboot`, crontabs por # usuario con `crontab -e`, `/etc/cron.d`, `cronnext`, y `anacron` para las tareas que hay que # recuperar cuando la máquina estuvo apagada. Cuál de los dos va en cada imagen es una decisión de # perfil, no de esta receta; lo que hacía falta era que la opción EXISTIERA en el corpus en vez de # descubrirse ausente el día que alguien la necesite. # # ⚠ EL DEFAULT QUE HABÍA QUE PINEAR SÍ O SÍ: `--with-editor`. Sin él, `configure.ac` hace # `AC_PATH_PROG([vi])` — o sea que la ruta del editor que `crontab -e` lanza SALE DE BUSCAR `vi` EN # EL LAB, y queda grabada en el binario con `AC_DEFINE_UNQUOTED`. El lab no entra en `hash_inputs`: # dos labs con `vi` en rutas distintas sellarían bytes distintos en la MISMA dirección del store y # nada lo notaría. Se fija en `/bin/vi`, que además es donde busybox lo deja de verdad (comprobado # en su artefacto sellado); el fallback de autoconf era `/usr/bin/vi`, que en esta distro no existe. # # Lo demás son palancas de cosas que el corpus no tiene, apagadas explícitamente por la misma razón # —que el probe no salga del entorno— y no porque estorben: # --without-pam no hay Linux-PAM en el corpus. La autorización de `crontab` cae entonces a # `/etc/cron.allow` + `/etc/cron.deny`, que es el mecanismo clásico y no # necesita nada más. # --without-selinux la distro no lleva SELinux. # --without-audit no hay libaudit. # --with-inotify esto se ENCIENDE: con inotify, crond se entera de un crontab editado sin # esperar al minuto siguiente. Es una API del kernel, no una dep nueva. # --enable-syscrontab `/etc/crontab` y `/etc/cron.d`, que es por donde entra el latido de la granja. # # `link = "static"`: binarios monolíticos como el resto de las herramientas de sistema. # # La licencia es compuesta y no se adivina: el grueso (`src/cron.c` y compañía) es ISC de Vixie/ISC, # y `anacron` —que se construye— trae su propio `COPYING.anacron`, GPLv2-or-later. name = "cronie" version = "1.7.2" license = "ISC AND GPL-2.0-or-later" [source] tarball = "https://github.com/cronie-crond/cronie/releases/download/cronie-1.7.2/cronie-1.7.2.tar.gz" sha256 = "f1da374a15ba7605cf378347f96bc8b678d3d7c0765269c8242cfe5b0789c571" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" flags = [] [build.phases] configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc --localstatedir=/var --sbindir=/usr/sbin --with-editor=/bin/vi --with-inotify --without-pam --without-selinux --without-audit --enable-syscrontab' compile = 'make -j"$(nproc)"' install = "make install DESTDIR=/out && find /out -name '*.la' -delete" [deps] build = ["binutils", "make", "pkgconf"] # ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ────────────────────────────────────────────────── # Fuera de `hash_inputs`: declarar esto NO re-hashea cronie. # # ⚠ SIN DISPARADOR PERIÓDICO UN SERVIDOR NO TIENE LATIDO, y eso no lo canta ninguna métrica: la # caja se ve perfecta —todo sellado, todo sirviendo— y no rota un log, no renueva nada por su # cuenta y no respalda nada. En la mudanza de gioser se descubrió al revés: el `crond` del origen # era el que disparaba la cosecha, el respaldo y la poda, y el destino no tenía NADA equivalente. # Es la misma familia que la lección de `foot`, pero de una CAPACIDAD, no de un paquete. # # `-n` (foreground) porque el supervisor es arje: un daemon que se va a segundo plano deja al init # cuidando un proceso que ya murió. `-P` deja el PATH del entorno en vez de reescribirlo. # # ⚠ La guarda mira el DIRECTORIO de spool, no un fichero: un `crond` sin `/var/spool/cron` arranca # igual y no ejecuta nada — un latido que late en el vacío es peor que uno ausente, porque parece # que está. # # ⚠ Y el spool de ESTA cronie es `/var/spool/cron/`, NO `/var/spool/cron/crontabs/` # (medido en la caja: `crontab -l` mostraba las entradas y `crontabs/` estaba vacío). La diferencia # importa el día que alguien restaure un crontab a mano en el sitio equivocado: quedaría un fichero # perfecto que nadie lee. El control que lo decide es el único que vale — meter una entrada # `* * * * *` en el crontab REAL y ver si dispara. [[service]] label = "crond" id = "01M2EKDA00CR0N1EDAEM0N5QZ8" exec = "/bin/busybox" argv = ["sh", "-c", "mkdir -p /var/spool/cron /etc/cron.d; test -d /var/spool/cron || { echo 'crond: no pude crear /var/spool/cron — sin spool no ejecuta NADA y arranca igual' >&2; exit 78; }; exec /usr/sbin/crond -n -P"] envp = [["PATH", "/usr/sbin:/usr/bin:/sbin:/bin"], ["HOME", "/root"], ["USER", "root"], ["SHELL", "/bin/sh"]] networking = "full" cgroup = "arje.slice/crond" restart = { initial_ms = 1000, max_ms = 30000 }