es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Puntos de control de secuencias de comandos Bash.

Estoy desarrollando un script grande cuya estructura se ve así:

#!/bin/bash

load_variables()

function1()
function2()
function3()
[...]
functionn()

Durante cada ejecución, primero se cargan las variables de usuario en la función load_variables().
Luego el script continúa su ejecución: function1() => function2() => [...] => functionn().

Necesito implementar puntos de control que se almacenarán en log.txt.
Digamos que el script se detuvo o se bloqueó en la función function2().
Quiero guardar el progreso antes de iniciar cada función, almacenarlo en log.txt y cuando vuelva a ejecutar el script, quiero cargar las variables con load_variables() y luego saltar al punto de bloqueo/punto de control almacenado en log.txt.

¿Cómo puedo lograr esto usando bash?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, puedes usar el comando trap en bash para capturar las señales del sistema que pueden terminar el script antes de que se complete la ejecución. Luego puedes escribir los datos de punto de control en el archivo log.txt antes de salir del script.

    Aquí tienes un ejemplo de implementación:

    #!/bin/bash
    
    # Cargar variables
    load_variables()
    
    # Función para escribir puntos de control en log.txt
    function write_checkpoint() {
      echo "Punto de control antes de $1" >> log.txt
      # Código adicional para almacenar los datos necesarios en log.txt
    }
    
    # Capturar señales del sistema y guardar punto de control antes de salir
    trap 'write_checkpoint "function_1()"; exit' INT TERM
    trap 'write_checkpoint "function_2()"; exit' QUIT
    
    # Definición de funciones
    function_1() {
      # Código para function_1()
    }
    
    function_2() {
      # Código para function_2()
    }
    
    function_3() {
      # Código para function_3()
      # Llamar a write_checkpoint para guardar el punto de control antes de pasar a la siguiente función
      write_checkpoint "function_3()"
    }
    
    # Ejecución principal del script
    function_1()
    function_2()
    function_3()
    [...]
    function_n()
    

    En esta implementación, la función write_checkpoint se llama antes de ejecutar cada función. El comando trap configura controladores de señal para capturar las señales de interrupción (INT, TERM, QUIT) y escribir un punto de control en log.txt antes de salir del script.

    Para reanudar la ejecución desde un punto de control anterior, puedes modificar el script para leer los puntos de control desde log.txt y saltar a la función correspondiente. Aquí tienes un ejemplo de implementación de esto:

    #!/bin/bash
    
    # Cargar variables
    load_variables()
    
    # Función para saltar al punto de control en log.txt
    function jump_to_checkpoint() {
      # Analizar log.txt para encontrar el punto de control para la función
      # Código adicional para leer y cargar los datos necesarios desde log.txt
      case "$1" in
        "function_1()")
          function_1()
          ;;
        "function_2()")
          function_2()
          ;;
        "function_3()")
          function_3()
          ;;
        [...]
        "function_n()")
          function_n()
          ;;
        *)
          echo "Función de punto de control inválida: $1"
          ;;
      esac
    }
    
    # Verificar si log.txt existe y saltar al último punto de control
    if [ -e log.txt ]; then
      checkpoint=$(tail -n 1 log.txt)
      jump_to_checkpoint "$checkpoint"
    fi
    
    # Función para escribir puntos de control en log.txt
    function write_checkpoint() {
      echo "Punto de control antes de $1" >> log.txt
      # Código adicional para almacenar los datos necesarios en log.txt
    }
    
    # Capturar señales del sistema y guardar punto de control antes de salir
    trap 'write_checkpoint "function_1()"; exit' INT TERM
    trap 'write_checkpoint "function_2()"; exit' QUIT
    
    # Definición de funciones
    function_1() {
      # Código para function_1()
    }
    
    function_2() {
      # Código para function_2()
    }
    
    function_3() {
      # Código para function_3()
      # Llamar a write_checkpoint para guardar el punto de control antes de pasar a la siguiente función
      write_checkpoint "function_3()"
    }
    
    # Ejecución principal del script
    function_1()
    function_2()
    function_3()
    [...]
    function_n()
    

    En esta implementación, el script verifica si log.txt existe y lee el último punto de control. Luego, la función jump_to_checkpoint salta a la función correspondiente según los datos del punto de control. El resto del script permanece igual que antes.

Comments are closed.