Creación y ejecución de un trabajo que se ejecuta indefinidamente

Aprende a crear y ejecutar una tarea de « Code Engine » que pueda ejecutarse de forma indefinida y no caduque.

Normalmente, los trabajos están diseñados para ejecutarse una vez y salir con un tiempo de ejecución máximo.

Sin embargo, suponga que desea sondear constantemente un almacén de datos de terceros. Puede optar por crear una aplicación; sin embargo, el puerto de la aplicación debe permanecer abierto para gestionar las solicitudes de HTTP. En su lugar, si no desea atender solicitudes de HTTP, puede optar por crear un trabajo que se ejecute sin un tiempo máximo de ejecución y que no se agote el tiempo.

Con Code Engine, puede elegir la modalidad del trabajo. Utilice la modalidad task predeterminada para los trabajos en los que se aplica un tiempo máximo de ejecución. Para estos trabajos, las instancias anómalas se reinician según el límite de reintentos de trabajo.

Si desea crear un trabajo que se pueda ejecutar de forma indefinida y no se haya agotado el tiempo de espera, utilice la modalidad daemon para los trabajos. Con esta modalidad, las ejecuciones del trabajo no agotan el tiempo de espera y las instancias anómalas se reinician automáticamente de forma indefinida.

Cuando utilice la modalidad daemon para ejecutar trabajos, si desea que Code Engine reinicie automáticamente el trabajo si se produce una anomalía, asegúrese de que el código se detiene con un código de salida distinto de cero. Si la imagen de contenedor asociada con el trabajo daemon finaliza con un código de salida 0, Code Engine presupone que el trabajo se ha detenido intencionadamente y que el trabajo no se ha reiniciado. Sin embargo, si el trabajo falla por una razón inesperada, y la imagen de contenedor asociada con las salidas de trabajo de daemon con un código de salida distinto de cero, Code Engine reinicia automáticamente el trabajo de daemon. Consulte ¿Por qué mi trabajo daemon no se reinicia automáticamente?

Con « Code Engine », solo pagas por los recursos que utilizas. Cuando el trabajo se ejecuta en modalidad daemon, tenga en cuenta que el trabajo siempre se está ejecutando hasta que suprima el trabajo.

Creación y ejecución de un trabajo que se ejecuta indefinidamente desde la consola

En este ejemplo se utilizan los ejemplos de « IBM Cloud Code Engine »; en concreto, el ejemplo « helloworld ». Cuando crea un trabajo que hace referencia al ejemplo icr.io/codeengine/helloworld y también especifica la modalidad como daemon, este trabajo se ejecuta sin un tiempo de ejecución máximo y las instancias fallidas se reinician indefinidamente. Si no se especifica la modalidad, de forma predeterminada, el trabajo se ejecuta en modalidad task.

  1. Crear su trabajo

    1. Abra la consola de Code Engine.
    2. Selecciona « Empezar a crear ».
    3. Seleccione un proyecto de la lista de proyectos disponibles. También puede crear uno nuevo. Tenga en cuenta que debe tener un proyecto seleccionado para crear un trabajo.
    4. Seleccione Trabajo.
    5. Especifique un nombre para el trabajo; por ejemplo, myjob.
    6. Elija el código que desea ejecutar. Puede crear el trabajo a partir de una imagen en un registro público, un registro privado o en IBM Cloud Container Registry. También puede crear el trabajo desde el código fuente repositorio o local. Para este ejemplo, utilice la imagen de ejemplo Code Engine, icr.io/codeengine/helloworld.
    7. En la sección Recursos y escalado, especifique daemon para la modalidad en los Valores de resiliencia. Cuando se especifica la modalidad daemon, las ejecuciones de trabajo para este trabajo se pueden ejecutar indefinidamente y no agotan el tiempo de espera. No hay límite de reintentos para estas ejecuciones de trabajo. Las ejecuciones de trabajos para estos trabajos se reinician automáticamente sin límite.
    8. Pulse Crear para crear el trabajo.
  2. En la página Trabajos, pulse la pestaña Trabajos para ver una lista de los trabajos definidos. Pulse el nombre del trabajo para abrir la configuración.

  3. Ejecute el trabajo.

    1. Pulse Enviar trabajo para abrir el diálogo Enviar trabajo. Revise y, opcionalmente, cambie los valores de configuración predeterminados como, por ejemplo, instancias, CPU, memoria, número de reintentos de trabajo y tiempo de espera de trabajo. Para obtener más información, consulte Opciones para crear y ejecutar un trabajo.
    2. Pulse Enviar trabajo para ejecutar el trabajo. El sistema muestra el estado de las instancias del trabajo en la página de detalles del trabajo. Si alguna de las instancias del trabajo no se ha podido ejecutar, estas instancias se reintentan automáticamente de forma indefinida.

    Para solucionar los errores habituales relacionados con los índices de ejecución de trabajos, consulta « Por qué pueden fallar los índices de ejecución de trabajos ».

  4. (opcional) Ver registros de la ejecución del trabajo. Desde la consola, puede ' ver los registros de trabajos desde la consola para sus ejecuciones de trabajo. Observe en la salida de registro para el ejemplo helloworld que la variable de entorno JOB_MODE muestra la modalidad del trabajo.

Creación y ejecución de un trabajo que se ejecuta indefinidamente con la CLI

Antes de empezar

En este ejemplo se utilizan los ejemplos de « IBM Cloud Code Engine »; en concreto, el ejemplo « helloworld ». Cuando crea un trabajo que hace referencia al ejemplo icr.io/codeengine/helloworld y también especifica --mode daemon, este trabajo se ejecuta sin un tiempo máximo de ejecución y las instancias anómalas se reinician indefinidamente. Si no se especifica la modalidad, de forma predeterminada, el trabajo se ejecuta en modalidad task.

  1. Cree el trabajo myjob-daemon, que utiliza la imagen de ejemplo icr.io/codeengine/helloworld. Para ejecutar esta imagen de ejemplo como un trabajo en modalidad daemon, especifique --mode daemon.

    ibmcloud ce job create --name myjob-daemon --image icr.io/codeengine/helloworld --mode daemon
    

    Salida de ejemplo

    Creating job 'myjob-daemon'...
    

    En la tabla siguiente se resumen las opciones que se utilizan con el mandato job create en este ejemplo. Para obtener más información sobre el mandato y sus opciones, consulte el mandato ibmcloud ce job create.

    Descripción del mandato
    Opción Descripción
    --name

    El nombre del trabajo. Utilice un nombre que sea exclusivo dentro del proyecto. Este valor es obligatorio.

    • El nombre debe empezar y terminar con un carácter alfanumérico en minúsculas.
    • El nombre debe tener 63 caracteres o menos y puede contener letras, números y guiones (-).
    --image El nombre de la imagen que se utiliza para las ejecuciones del trabajo.
    --mode La modalidad para las ejecuciones del trabajo. Los valores válidos son « task » (por defecto) y « daemon ». En la modalidad daemon, no hay ningún valor de tiempo de espera y las instancias anómalas se reinician indefinidamente.
  2. (opcional) Utilice el mandato job get para visualizar información sobre el trabajo.

    ibmcloud ce job get --name myjob-daemon
    

    Salida de ejemplo

    [...]
    Name:          myjob-daemon
    ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
    Project Name:  myproject
    Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
    Age:           2d15h
    Created:       2022-04-14T16:10:11-04:00
    Image:                icr.io/codeengine/helloworld
    Resource Allocation:
      CPU:     1
      Memory:  4G
    Runtime:
        Mode:                  daemon
        Array Indices:         0
        Array Size:            1
        Max Execution Time:    7200
        Retry Limit:           3
    [...]
    
  3. Ejecute el trabajo. Este mandato de ejemplo ejecuta la ejecución del trabajo myjobrun-daemon que se basa en la configuración del trabajo myjob-daemon.

    ibmcloud ce jobrun submit --name myjobrun-daemon --job myjob-daemon
    
  4. (opcional) Vea los detalles de la ejecución del trabajo.

    ibmcloud ce jobrun get --name myjobrun-daemon
    

    Salida de ejemplo

    Getting jobrun 'myjobrun-daemon'...
    Getting instances of jobrun 'myjobrun-daemon'...
    Getting events of jobrun 'myjobrun-daemon'...
    For troubleshooting information visit: https://cloud.ibm.com/docs/codeengine?topic=codeengine-troubleshoot-job.
    Run 'ibmcloud ce jobrun events -n myjobrun-daemon' to get the system events of the job run instances.
    Run 'ibmcloud ce jobrun logs -f -n myjobrun-daemon' to follow the logs of the job run instances.
    OK
    Name:          myjobrun-daemon
    ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
    Project Name:  myproject
    Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
    Age:           2d15h
    Created:       2022-04-14T16:10:11-04:00
    Job Ref:              myjob-daemon
    Image:                icr.io/codeengine/helloworld
    Resource Allocation:
      CPU:                1
      Ephemeral Storage:  400M
      Memory:             4G
    Runtime:
        Mode:                  daemon
        Array Indices:         0
        Array Size:            1
        JOP_ARRAY_SIZE Value:  1
        Max Execution Time:    7200
        Retry Limit:           3
    Status:
      Instance Statuses:
        Running:  1
      Conditions:
        Type     Status  Last Probe  Last Transition
        Pending  True    27s         27s
        Running  True    4s          4s
    Events:
      Type    Reason   Age               Source                Messages
      Normal  Updated  4s (x3 over 26s)  batch-job-controller  Updated JobRun "myjobrun-daemon"
    Instances:
      Name                 Running  Status   Restarts  Age
      myjobrun-daemon-0-0  1/1      Running  0         26s
    
  5. (opcional) Ver registros para la ejecución del trabajo. Con la CLI, puede ver registros de trabajo para todas las instancias de una ejecución de trabajo o para una instancia de ejecución de trabajo determinada. El ejemplo siguiente muestra registros de trabajo para todas las instancias de la ejecución del trabajo myjobrun-daemon.

    ibmcloud ce jobrun logs --name myjobrun-daemon
    

    Salida de ejemplo

    Getting logs for all instances of job run 'myjobrun-daemon'...
    Getting jobrun 'myjobrun-daemon'...
    Getting instances of jobrun 'myjobrun-daemon'...
    OK
    myjobrun-daemon-0-0/myjob-daemon:
    Hello from helloworld! I'm a batch job! Index: 0
    Hello World from:
    . ___  __  ____  ____
    ./ __)/  \(    \(  __)
    ( (__(  O )) D ( ) _)
    .\___)\__/(____/(____)
    .____  __ _   ___  __  __ _  ____
    (  __)(  ( \ / __)(  )(  ( \(  __)
    .) _) /    /( (_ \ )( /    / ) _)
    (____)\_)__) \___/(__)\_)__)(____)
    Some Env Vars:
    --------------
    CE_DOMAIN=us-south.codeengine.appdomain.cloud
    CE_JOB=myjob-daemon
    CE_JOBRUN=myjobrun-daemon
    CE_SUBDOMAIN=glxo4k7nj7d
    HOME=/root
    HOSTNAME=myjobrun-daemon-0-0
    JOB_INDEX=0
    JOB_MODE=daemon
    KUBERNETES_PORT=tcp://172.21.0.1:443
    KUBERNETES_PORT_443_TCP=tcp://172.21.0.1:443
    KUBERNETES_PORT_443_TCP_ADDR=172.21.0.1
    KUBERNETES_PORT_443_TCP_PORT=443
    KUBERNETES_PORT_443_TCP_PROTO=tcp
    KUBERNETES_SERVICE_HOST=172.21.0.1
    KUBERNETES_SERVICE_PORT=443
    KUBERNETES_SERVICE_PORT_HTTPS=443
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    PWD=/
    SHLVL=1
    z=Set env var 'SHOW' to see all variables
    

Ahora que el trabajo se ha creado en modalidad daemon, el trabajo se ejecuta indefinidamente. Puesto que no hay tiempo de espera y las instancias fallidas se reinician indefinidamente, las opciones --maxexecutiontime y --retrylimit no están permitidas cuando se ejecuta un trabajo en modalidad daemon.

Tenga en cuenta que la variable de entorno JOB_MODE muestra la modalidad de las ejecuciones del trabajo.

Detención de un trabajo que se ejecuta indefinidamente

Cuando ejecuta un trabajo en modalidad daemon, se puede ejecutar de forma indefinida, ya que se ejecuta sin un tiempo máximo de ejecución y las instancias fallidas se reintentan automáticamente de forma indefinida. Para detener un trabajo que está en modalidad daemon, suprima la ejecución del trabajo específico o suprima el trabajo.

Detención de un trabajo que se ejecuta indefinidamente desde la consola

  • Para suprimir una ejecución de trabajo específica, vaya a la página de trabajo correspondiente a su trabajo específico. Vaya a la pestaña Ejecuciones de trabajo. Elimina la ejecución del trabajo que quieras eliminar.

  • Para suprimir un trabajo, vaya a la página Trabajos, pulse el nombre del trabajo que desea eliminar. Al suprimir un trabajo se suprime el trabajo, su configuración y cualquier ejecución de trabajo asociada con el trabajo.

Detención de un trabajo que se ejecuta indefinidamente con la CLI

  • Para suprimir un trabajo específico ejecutado con la CLI, utilice el mandato jobrun delete. Si lo deseas, puedes utilizar la opción « -f » para forzar la eliminación de una ejecución de tarea sin necesidad de confirmación.

    ibmcloud ce jobrun delete --name myjobrun-daemon -f
    

    Salida de ejemplo

    Deleting job run 'myjobrun-daemon'...
    OK
    
  • Para suprimir un trabajo con la CLI, utilice el mandato job delete. Si lo deseas, puedes utilizar la opción « -f » para forzar la eliminación de un trabajo sin necesidad de confirmación. Cuando suprime un trabajo, también se suprime cualquier trabajo que se ejecute para este trabajo. El ejemplo siguiente suprime el trabajo myjob-daemon,

    ibmcloud ce job delete --name myjob-daemon -f
    

    Salida de ejemplo

    Deleting job 'myjob-daemon'...
    OK