OffVPSVPS OFFSHORESoporte

Pequeñas automatizaciones

为一个小型计划任务设定明确边界。

Una pequeña tarea fiable tiene un final claro, un registro de su resultado y una regla para una segunda ejecución que llegue demasiado pronto. Elija esos comportamientos antes de elegir una programación horaria o diaria.

Guida sul campo OffVPS · Revisionato · 5 min di lettura

Defina una única pieza finita de trabajo

Imagine una herramienta personal que reconstruye un pequeño resumen diario a partir de sus registros existentes. La tarea lee un conjunto acotado de datos, prepara un resumen de reemplazo y termina. No es un servidor web y no debería seguir ejecutándose entre inicios programados. Anote la entrada, el destino, la duración esperada y qué cuenta como éxito antes de añadir un timer.

El ejemplo asume un host Linux con systemd y util-linux flock, acceso de administrador, y una cuenta y grupo sin privilegios existentes llamados fieldjob. Su script de tarea revisado se encuentra en /opt/field-jobs/build-summary y se ejecuta en primer plano. Un administrador es dueño de ese script; la cuenta de la tarea puede leerlo y ejecutarlo, pero no puede reescribir su código. Verifique las rutas de ejecutables en su distribución. Estas son plantillas, no un servicio de programación OffVPS instalado.

El script debe informar un fallo con un estado de salida distinto de cero. Para archivos de reemplazo, diséñelo para preparar y comprobar un resultado temporal antes de publicarlo. Para trabajo de base de datos, use el mecanismo de transacción o deduplicación de la base de datos. Un bloqueo por sí solo no puede hacer que una tarea completada parcialmente sea segura de repetir.

Elija una zona horaria y una política de ejecuciones omitidas

Nuestro resumen es útil una vez al día a las 02:15 UTC. Use una zona explícita para que la zona horaria local de la máquina no sea una dependencia invisible. UTC evita los cambios estacionales de reloj en este ejemplo; una tarea empresarial ligada a la hora civil local necesita una zona horaria con nombre y una revisión de su comportamiento con el horario de verano. La referencia de tiempo de systemd describe expresiones de calendario.

Guarde esta plantilla como /etc/systemd/system/field-summary.timer en el VPS previsto después de revisar los nombres:

[Unit]
Description=Daily personal-tool summary

[Timer]
OnCalendar=*-*-* 02:15:00 UTC
Persistent=true
Unit=field-summary.service

[Install]
WantedBy=timers.target

Persistent=true solicita una activación de recuperación tras un periodo inactivo si se omitió un evento de calendario. No reproduce una ejecución separada por cada día omitido. Un timer tampoco inicia otra instancia del mismo servicio mientras ese servicio está activo. Estos comportamientos, y la precisión de la programación, están cubiertos por la referencia de timers. Decida si un resumen tardío es útil antes de habilitar la recuperación.

Configure el usuario de servicio, el directorio de estado y el bloqueo

El /etc/systemd/system/field-summary.service correspondiente describe el trabajo:

[Unit]
Description=Build the personal-tool summary

[Service]
Type=oneshot
User=fieldjob
Group=fieldjob
WorkingDirectory=/opt/field-jobs
StateDirectory=field-summary
StateDirectoryMode=0700
UMask=0077
ExecStart=/usr/bin/flock --nonblock --conflict-exit-code 75 /var/lib/field-summary/job.lock /opt/field-jobs/build-summary
TimeoutStartSec=5min
StandardOutput=journal
StandardError=journal

Type=oneshot es adecuado para un comando que termina; un tiempo de espera de inicio explícito acota este ejemplo. No añada RemainAfterExit=yes a un servicio que debe quedar inactivo después de cada ejecución. Consulte la semántica de servicios de systemd. Establezca un tiempo de espera a partir de la carga de trabajo, y haga segura la interrupción en lugar de asumir que cinco minutos sirven para cualquier tarea.

Para este servicio del sistema, StateDirectory crea el directorio nombrado bajo /var/lib con propiedad del servicio. El directorio de trabajo, el usuario, los permisos y los destinos de salida son explícitos; el script debe usar rutas absolutas para sus propias herramientas y datos. Las reglas de entorno y directorios están documentadas en la referencia de ejecución de systemd. No coloque valores secretos en argumentos de línea de comandos ni los registre.

El envoltorio no bloqueante flock sale con código 75 cuando otra invocación cooperativa mantiene este bloqueo. Dejamos eso deliberadamente como un fallo visible que requiere revisión, en lugar de tratar un resumen omitido como trabajo completado. Todas las invocaciones manuales deben usar el mismo envoltorio y la misma ruta de bloqueo. No elimine un archivo de bloqueo para liberar una tarea en ejecución: un archivo nuevo puede crear un bloqueo separado. Este es un patrón de sistema de archivos local, no un bloqueo distribuido entre instancias de VPS. Consulte el manual de flock upstream.

Compruebe los archivos, luego pruebe una ejecución controlada

Use un conjunto de datos desechable con correo saliente, pagos y otros efectos secundarios deshabilitados para la primera ejecución. Antes de la activación, inspeccione la programación analizada y los archivos de unidad en ese host de prueba:

systemd-analyze calendar '*-*-* 02:15:00 UTC'
systemd-analyze verify /etc/systemd/system/field-summary.service /etc/systemd/system/field-summary.timer

Estas comprobaciones pueden detectar errores de unidad y de programación; no pueden establecer que su script produzca un resumen correcto. La referencia de systemd-analyze explica su alcance. Después de corregir errores, cargue los archivos revisados e inicie explícitamente la tarea de prueba:

sudo systemctl daemon-reload &&
  sudo systemctl start field-summary.service
systemctl status field-summary.service --no-pager
sudo journalctl -u field-summary.service --since "10 minutes ago" --no-pager

Předpokládejte konečné úspěšné vyvolání a zkontrolovaný výstupní artefakt; úspěšný oneshot může následně vykazovat neaktivitu. Prozkoumejte samotný výsledek, včetně chování při prázdném vstupu. Záměrně zpomalte testovací běh, vyvolejte stejný uzamčený příkaz dvakrát na testovací datové sadě a ověřte, že druhé vyvolání hlásí konflikt zámku, aniž by zapsalo konkurující výsledek.

Habilite la programación solo después de comprobar su salida

sudo systemctl enable --now field-summary.timer
systemctl list-timers field-summary.timer --all

Zkontrolujte další naplánovaný čas a poté si prohlédněte první naplánovaný výsledek. V protokolech skriptu uchovávejte čas spuštění, čas dokončení, počet zpracovaných položek a výsledek. Chybějící záznam o úspěchu je důvodem k prošetření, nikoli důkazem, že úloha běžela. Viz příkazy časovače a aktivace systemctl.

Chcete-li pozastavit budoucí spuštění, použijte sudo systemctl disable --now field-summary.timer. To neukončí již běžící službu. Pokud je nutné přerušení, nejprve zjistěte, zda lze její aktuální zápis bezpečně zastavit. S rostoucí prací kontrolujte dobu trvání, opakování a limity externích rozhraní API; více strojů vyžaduje sdílenou koordinaci. Pokračujte scénářem osobních nástrojů a cvičením obnovy pro data, která tato automatizace spravuje.

使用的文档

本页的主要参考。请核对您自己环境中安装版本对应的文档。