Workiva Scripting supervisa automáticamente los recursos utilizados por cada script que se ejecuta, incluyendo la memoria, la CPU, el uso del disco y la hora de ejecución. Cuando un script supera los límites de recursos configurados, el Scripting intenta detenerlo de forma segura, manteniendo la estabilidad de la plataforma. Además, el sistema da tiempo a los scripts para que se limpien y salgan antes de que se detengan por completo, garantizando una interrupción mínima para los usuarios.
Este artículo explica cómo maneja Scripting los escenarios de finalización, qué detalles aparecen en los registros e incluye capturas de pantalla de referencia.
Para obtener información detallada sobre todos los límites del sistema, consulta Límites de Workiva Scripting.
Escenarios
| Escenario | Comportamiento | Iniciando sesión |
| Ejecución muy corta | Ejecución correcta | No se han registrado datos de utilización de recursos. |
| Finalización normal | Ejecución correcta | Se registra un resumen completo de la utilización de recursos (a menos que sea demasiado corto para tomar una muestra) |
| Superación del límite de memoria | Finalización automática | Muestra el umbral de memoria superado, muestra la media y el pico de uso |
| Límite de disco superado | Finalización automática | Muestra el umbral de disco superado, muestra la media y el pico de uso |
| Superación del tiempo asignado | Finalización automática | Muestra el tiempo de ejecución superado y el tiempo total utilizado |
| Cancelación manual | Cancelación automática | Liberación total de recursos, resumen de recursos registrado |
| Finalización inesperada | Finalización intempestiva | Registro parcial o incompleto de los datos de utilización. |
Al aplicar los Límites de recursos automáticamente y proporcionar registros detallados (como se muestra en las capturas de pantalla siguientes), Workiva Scripting garantiza tanto la fiabilidad de la plataforma como la transparencia para los desarrolladores que crean y optimizan scripts de automatización.
Finalización cuando una ejecución se completa correcta/correctamente.
Cuando un script se completa normalmente sin superar los límites, el registro incluye un resumen de uso de recursos que muestra el uso medio y máximo en memoria, CPU, disco y tiempo de ejecución. Esta información proporciona visibilidad sobre las características de rendimiento de las ejecuciones completadas correctamente.
Nota: Si un script se ejecuta muy rápidamente (por ejemplo, menos de 1 segundo), puede que no se produzca el muestreo de recursos. En esos casos, no se notificarán datos de utilización de recursos en el registro.
El script se ejecuta demasiado rápido para muestrearlo.
Si un script termina demasiado rápido, el monitor no puede capturar datos de utilización.
El script tiene una salida normal
Si un script finaliza sin superar ningún límite, las estadísticas de utilización de recursos se muestran completamente en el registro.
Finaliza cuando se superan los Límites
Si la ejecución de un script excede los límites configurados (por ejemplo, memoria, uso del disco o tiempo asignado), Scripting lo hará:
- Intentar detener el script de forma segura-Cuando se superan los límites, Scripting envía primero una señal de finalización (SIGTERM) para que el script se limpie y salga en 15 segundos.
- Si el script no sale en 15 segundos, el script envía una señal SIGKILL, que detiene inmediatamente el proceso sin permitir ninguna limpieza. Se trata de una finalización forzosa, y la ejecución se completará con un estado fallido (mostrado en rojo en el registro). Este estado indica un error del Sistema de Script.
- Registra el motivo de la detención: el registro mostrará qué límite se alcanzó y resumirá el uso de recursos del script.
Las siguientes secciones proporcionan ejemplos de lo que ocurre cuando un script supera los límites sin código para manejar estas señales. Para aprender a modificar tus scripts para que respondan con elegancia a estas señales, consulta Manejo de las señales del sistema en los scripts.
Límite de memoria superado
Cuando un script supera el límite de memoria configurado, el registro incluye el motivo de la finalización y detalles sobre el umbral superado.
Límite de utilización de disco superado
Cuando un script supera el límite de uso de disco configurado, el registro incluye el motivo de la finalización y detalles sobre el uso del disco en el momento en que se alcanzó el límite.
Tiempo asignado superado
Cuando un script supera el tiempo asignado configurado, el registro incluye el motivo de la finalización y el tiempo total de ejecución registrado.
Finalización cuando el usuario cancela una ejecución
Si un usuario cancela manualmente una ejecución, el Scripting envía primero una señal de interrupción (SIGINT) para que el script sepa que debe detenerse. El script tiene 15 segundos para limpiar, guardar el progreso o retroceder antes de apagarse. Después de este periodo de gracia de 15 segundos, tiene lugar la misma secuencia descrita anteriormente: se envía una señal de finalización (SIGTERM) para permitir que transcurran otros 15 segundos hasta que el script complete la limpieza, seguida de una señal de muerte final (SIGKILL) si el script aún no ha salido.
La imagen de abajo muestra cómo aparecen los registros del script cuando éste no incluye código para manejar la señal de interrupción.
Para aprender a modificar tus scripts para que respondan con elegancia a estas señales, consulta Manejo de señales del sistema en scripts.
Terminaciones no planificadas
En raras ocasiones, como cuando un script consume memoria más rápido de lo que el sistema de Scripting puede monitorizar el consumo, el sistema puede terminar un script antes de detectar que se ha superado un límite. Cuando esto ocurre, Iniciando sesión registra un informe de utilización incompleto, mostrando solo los puntos de datos recogidos antes de la terminación.
Manejo de las señales del sistema en los scripts
El manejo de señales permite que tu script se cierre limpiamente cuando es cancelado o detenido por el sistema. Al captar y responder a las señales del sistema, tu script puede liberar recursos, guardar trabajo y salir con elegancia (por ejemplo, cuando el estado se notifica como "completo") en lugar de terminar por la fuerza.
Cuando un script se detiene porque un usuario lo cancela o supera los límites de la plataforma, el Scripting emite señales de interrupción, finalización y eliminación. Ver más información sobre cómo se activan las señales de interrupción, finalización y eliminación en las secciones anteriores.
Señales de script y cómo manejarlas
Esta sección proporciona bloques de código y un ejemplo completo que puedes utilizar para manejar estas señales.
Puedes mantener pequeños los manejadores de señales y manejar la limpieza en un solo lugar utilizando un bloque try/finally que siempre se ejecuta al apagarse. Esto hace que los scripts sean predecibles y fáciles de mantener.
La estructura general para manejar las señales en tu script es la misma, independientemente de la señal que se reciba:
- Inicio del archivo: importar módulos y definir el manejador
- Inicialización temprana: registra el manejador antes de hacer cualquier trabajo
- Alrededor de tu trabajo: envuelve el código principal en un bloque
try/finallypara que siempre se ejecute la limpieza
El usuario cancela la ejecución (SIGINT)
Esto ocurre cuando un usuario hace clic en Cancelar para cancelar la ejecución del script.
# --- Parte superior del archivo --- import signal, sys # Pequeño gestor: solicita una salida inmediata y con gracia def _graceful_exit(señal, trama): print("Recibido SIGINT: solicitada la cancelación. Limpiando...") raise SystemExit(0) # --- Inicialización temprana --- signal.signal(signal.SIGINT, _graceful_exit) Alrededor de tu trabajo (más adelante en el archivo):
Inténtalo: # tu trabajo de larga duración aquí ... finalmente: # lugar central para cerrar archivos, vaciar registros, etc. print("Limpieza final antes de salir") La imagen siguiente muestra cómo aparecen los registros del script cuando se gestiona la señal de interrupción (SIGINT).
Gestión directa de KeyboardInterrupt
Workiva Scripting también lanza KeyboardInterrupt cuando se envía SIGINT al hilo principal. Puedes atrapar esta excepción en tu bloque try y llamar a la misma ruta de limpieza definida por _graceful_exit().
prueba: # tu trabajo de larga duración aquí ... except InterrupciónDelTeclado: print("InterrupciónDelTeclado Recibida: limpieza antes de salir...") _graceful_exit(None, None) finally: # lugar central para cerrar archivos, vaciar registros, etc. print("Limpieza final antes de salir") La imagen de abajo muestra cómo aparecen los registros del script cuando la señal de interrupción se gestiona mediante una interrupción del teclado.
Señal de finalización de script para que se detenga tras un periodo de gracia (SIGTERM)
El script pide a tu script que se detenga (por ejemplo, después de superar los límites). Tu script tiene un breve periodo de gracia para salir.
# --- Comienzo del archivo --- def _término_gracioso(señal, marco): print("SIGTERM recibido: la plataforma ha solicitado la finalización. Finalizando...") raise SystemExit(0) # --- Inicialización temprana --- signal.signal(signal.SIGTERM, _graceful_term) La imagen de abajo muestra cómo aparecen los registros del script cuando se gestiona la señal de finalización (SIGTERM).
Señal de muerte del script para que se detenga inmediatamente (SIGKILL)
Si tu script no sale durante el periodo de gracia, Scripting enviará SIGKILL. No puedes atrapar SIGKILL. Sal rápidamente con SIGINT/SIGTERM para que tu bloque finalmente pueda ejecutarse antes de que se produzca un asesinato.
Las capturas de pantalla de las secciones anteriores muestran cómo se verían los registros como resultado de la señal de matar.
Ejemplo completo (listo para copiar y pegar)
Esta plantilla registra manejadores mínimos y centraliza la limpieza en finalmente. Pega en Workiva Scripting y reemplaza el área marcada por tu lógica.
Dónde añadir/agregar tu código: Reemplaza el bucle de ejemplo bajo # ===== TU CÓDIGO COMIENZA AQUÍ ===== con tus tareas reales. Evita las llamadas ininterrumpibles muy largas para que el script pueda llegar al bloque finally antes de que la plataforma escale a SIGKILL.
"""Plantilla de Workiva Scripting: manejadores mínimos + limpieza en finally - Los manejadores diminutos levantan SystemExit(0) en SIGINT/SIGTERM - Se ejecuta un único bloque finally para la limpieza, independientemente de cómo se detenga el script - Mantiene el código pequeño y predecible """ import signal import time # --- Manejadores de señales (mantener diminuto) --- def _graceful_exit(signum, frame): print("SIGINT recibido: cancelación solicitada. Limpiando...") raise SystemExit(0) def _graceful_term(signum, frame): print("Recibido SIGTERM: plataforma solicitada terminación. Terminando...") raise SystemExit(0) # --- Registra los manejadores ANTES de hacer ningún trabajo pesado --- signal.signal(signal.SIGINT, _graceful_exit) signal.signal(signal.SIGTERM, _graceful_term) # --- El trabajo principal de tu script --- def main(): print("Empezando a trabajar...") # ===== TU CÓDIGO EMPIEZA AQUÍ ===== # Ejemplo de bucle de larga duración. Reemplazar por tu lógica real. for i in range(1, 1_000_000): # Simula una unidad de trabajo (Reemplazando por tu lógica real) print(f "Trabajando en el elemento {i}...") time.sleep(1) # ===== TU CÓDIGO TERMINA AQUÍ ===== if __name__ == "__main__": try: main() finally: # Limpieza centralizada que siempre se ejecuta (incluso en SIGINT/SIGTERM) print("Limpieza final/definitiva antes de salir")