Création et exécution d'un travail qui s'exécute indéfiniment

Découvrez comment créer et exécuter une tâche « Code Engine » qui peut s'exécuter indéfiniment sans délai d'expiration.

En règle générale, les travaux sont conçus pour s'exécuter une seule fois et se fermer avec un temps d'exécution maximal.

Toutefois, supposons que vous souhaitiez interroger en permanence un magasin de données tiers. Vous pouvez choisir de créer une application ; cependant, le port app doit rester ouvert pour traiter les demandes HTTP. En revanche, si vous ne souhaitez pas traiter les demandes HTTP, vous pouvez choisir de créer un travail qui s'exécute sans durée d'exécution maximale et sans délai d'attente.

Avec Code Engine, vous pouvez choisir le mode de votre travail. Utilisez le mode task par défaut pour les travaux pour lesquels une durée d'exécution maximale s'applique. Pour ces travaux, les instances ayant échoué sont redémarrées en fonction du nombre maximal de nouvelles tentatives de travail.

Si vous souhaitez créer un travail qui peut s'exécuter indéfiniment et qui n'a pas de délai d'attente, utilisez le mode daemon pour vos travaux. Avec ce mode, les exécutions du travail n'ont pas de délai d'attente et les instances ayant échoué sont automatiquement redémarrées indéfiniment.

Lorsque vous utilisez le mode daemon pour exécuter des travaux, si vous souhaitez que Code Engine redémarre automatiquement le travail en cas d'échec, assurez-vous que votre code s'arrête avec un code de sortie différent de zéro. Si l'image de conteneur associée à votre travail de démon se termine par un code d'exit 0, Code Engine suppose que le travail a été arrêté intentionnellement et qu'il n'est pas redémarré. Toutefois, si le travail échoue pour une raison inattendue et que l'image de conteneur associée à votre travail de démon se ferme avec un code d'exit différent de zéro, Code Engine redémarre automatiquement le travail de démon. Voir Pourquoi mon travail de démon ne redémarre-t-il pas automatiquement?

Avec « Code Engine », vous ne payez que les ressources que vous utilisez. Lorsque votre travail s'exécute en mode daemon, sachez que le travail est toujours en cours d'exécution jusqu'à ce que vous le supprimiez.

Création et exécution d'un travail qui s'exécute indéfiniment à partir de la console

Cet exemple utilise les exemples disponibles sur IBM Cloud Code Engine; il s'agit plus précisément de l'exemple « helloworld ». Lorsque vous créez un travail qui fait référence à l'exemple icr.io/codeengine/helloworld et que vous spécifiez également le mode daemon, ce travail s'exécute sans durée d'exécution maximale et les instances ayant échoué sont redémarrées indéfiniment. Si le mode n'est pas spécifié, par défaut, le travail s'exécute en mode task.

  1. Créez votre travail

    1. Ouvrez la console Code Engine.
    2. Sélectionnez « Commencer la création ».
    3. Sélectionnez un projet dans la liste des projets disponibles. Vous pouvez aussi en créer un. Notez que vous devez disposer d'un projet sélectionné pour créer un travail.
    4. Sélectionnez Travail.
    5. Entrez un nom pour le travail, par exemple myjob.
    6. Choisissez le code à exécuter. Vous pouvez créer votre travail à partir d'une image dans un registre public, un registre privé ou dans IBM Cloud Container Registry. Vous pouvez également créer votre travail à partir du référentiel ou du code source local. Pour cet exemple, utilisez l'exemple d'image Code Engine, icr.io/codeengine/helloworld.
    7. Dans la section Ressources & mise à l'échelle, spécifiez daemon pour le mode dans les Paramètres de résilience. Lorsque vous spécifiez le mode daemon, les exécutions de travail pour ce travail peuvent s'exécuter indéfiniment et elles ne sont pas hors délai. Il n'y a pas de limite de relance pour ces exécutions de travail. Tout travail exécuté pour ces travaux est automatiquement redémarré sans limite.
    8. Cliquez sur Créer pour créer le travail.
  2. Dans la page Travaux, cliquez sur l'onglet Travaux pour afficher la liste des travaux définis. Cliquez sur le nom de votre travail pour ouvrir la configuration.

  3. Exécutez le travail.

    1. Cliquez sur Soumettre un travail pour ouvrir la boîte de dialogue Soumettre un travail. Examinez et modifiez éventuellement les valeurs de configuration par défaut (Instances, UC, Mémoire, Nombre de nouvelles tentatives de travail et Délai d'attente du travail). Pour plus d'informations sur ces options, voir Options de création et d'exécution d'un travail.
    2. Cliquez sur Soumettre un travail pour exécuter votre travail. Le système affiche le statut des instances de votre travail sur la page des détails du travail. Si l'une des instances de votre travail n'a pas pu s'exécuter, ces instances sont automatiquement relancées indéfiniment.

    Pour résoudre les erreurs courantes liées aux index d'exécution des tâches, consultez la section « Comprendre les causes d'échec des index d'exécution des tâches ».

  4. (Facultatif) Affichez les journaux de l'exécution de travail. Dans la console, vous pouvez " afficher les journaux des travaux à partir de la console pour l'exécution de vos travaux. Notez dans la sortie du journal de l'exemple helloworld que la variable d'environnement JOB_MODE affiche le mode du travail.

Création et exécution d'un travail qui s'exécute indéfiniment avec l'interface de ligne de commande

Avant de commencer

Cet exemple utilise les exemples disponibles sur IBM Cloud Code Engine; il s'agit plus précisément de l'exemple « helloworld ». Lorsque vous créez un travail qui fait référence à l'exemple icr.io/codeengine/helloworld et que vous spécifiez également --mode daemon, ce travail s'exécute sans durée d'exécution maximale et les instances ayant échoué sont redémarrées indéfiniment. Si le mode n'est pas spécifié, par défaut, le travail s'exécute en mode task.

  1. Créez le travail myjob-daemon, qui utilise l'exemple d'image icr.io/codeengine/helloworld. Pour exécuter cet exemple d'image en tant que travail en mode daemon, spécifiez --mode daemon.

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

    Exemple de sortie

    Creating job 'myjob-daemon'...
    

    Le tableau suivant récapitule les options utilisées avec la commande job create dans cet exemple. Pour plus d'informations sur la commande et ses options, voir la commande ibmcloud ce job create.

    Description de la commande
    Option Description
    --name

    Nom du travail. Utilisez un nom unique dans le projet. Cette valeur est requise.

    • Le nom doit commencer et se terminer par un caractère alphanumérique en minuscules.
    • Le nom doit contenir 63 caractères ou moins et peut contenir des lettres, des nombres et des traits d'union (-).
    --image Nom de l'image qui est utilisée pour les exécutions du travail.
    --mode Mode pour les exécutions du travail. Les valeurs valides sont « task » (par défaut) et « daemon ». En mode daemon, il n'y a pas de valeur de délai d'attente et les instances ayant échoué sont redémarrées indéfiniment.
  2. (Facultatif) Utilisez la commande job get pour afficher des informations sur votre travail.

    ibmcloud ce job get --name myjob-daemon
    

    Exemple de sortie

    [...]
    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. Exécutez votre travail. Cet exemple de commande exécute l'exécution de travail myjobrun-daemon basée sur la configuration de travail myjob-daemon.

    ibmcloud ce jobrun submit --name myjobrun-daemon --job myjob-daemon
    
  4. (Facultatif) Affichez les détails de l'exécution de votre travail.

    ibmcloud ce jobrun get --name myjobrun-daemon
    

    Exemple de sortie

    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. (Facultatif) Affichez les journaux de l'exécution de travail. Avec l'interface de ligne de commande, vous pouvez afficher les journaux de travail pour toutes les instances d'une exécution de travail ou pour une instance d'exécution de travail particulière. L'exemple suivant affiche les journaux de travail pour toutes les instances de l'exécution de travail myjobrun-daemon.

    ibmcloud ce jobrun logs --name myjobrun-daemon
    

    Exemple de sortie

    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
    

Maintenant que votre travail est créé en mode daemon, il s'exécute indéfiniment. Comme il n'y a pas de délai d'attente et que les instances ayant échoué sont redémarrées indéfiniment, les options --maxexecutiontime et --retrylimit ne sont pas autorisées lorsque vous exécutez un travail en mode daemon.

Notez que la variable d'environnement JOB_MODE affiche le mode des exécutions du travail.

Arrêt d'un travail qui s'exécute indéfiniment

Lorsque vous exécutez un travail en mode daemon, il peut s'exécuter indéfiniment, car il s'exécute sans durée d'exécution maximale et toutes les instances ayant échoué sont automatiquement relancées indéfiniment. Pour arrêter un travail qui est en mode daemon, supprimez l'exécution de travail spécifique ou supprimez le travail.

Arrêt d'un travail qui s'exécute indéfiniment à partir de la console

  • Pour supprimer une exécution de travail spécifique, accédez à la page de travail correspondant à votre travail spécifique. Accédez à l'onglet Exécution de travaux. Supprimez l'exécution de la tâche que vous souhaitez supprimer.

  • Pour supprimer un travail, accédez à la page Travaux et cliquez sur le nom du travail à supprimer. La suppression d'un travail supprime le travail, sa configuration et toute exécution de travail associée au travail.

Arrêt d'un travail qui s'exécute indéfiniment à l'aide de l'interface de ligne de commande

  • Pour supprimer une exécution de travail spécifique à l'aide de l'interface de ligne de commande, utilisez la commande jobrun delete. Vous pouvez, si vous le souhaitez, utiliser l'option « -f » pour forcer la suppression d'une exécution de tâche sans confirmation.

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

    Exemple de sortie

    Deleting job run 'myjobrun-daemon'...
    OK
    
  • Pour supprimer un travail à l'aide de l'interface de ligne de commande, utilisez la commande job delete. Vous pouvez, si vous le souhaitez, utiliser l'option « -f » pour forcer la suppression d'une tâche sans confirmation. Lorsque vous supprimez un travail, tout travail exécuté pour ce travail est également supprimé. L'exemple suivant supprime le travail myjob-daemon:

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

    Exemple de sortie

    Deleting job 'myjob-daemon'...
    OK