IBM Cloud Docs
创建和运行无限期运行的作业

创建和运行无限期运行的作业

了解如何创建和运行可无限期运行且不会超时的 Code Engine 作业。

通常,作业设计为运行一次并以最大执行时间退出。

但是,假设您希望不断轮询第三方数据存储器。 您可以选择创建一个应用程序;但是,应用程序端口必须保持打开状态,以便处理 HTTP 请求。 如果您不想处理 HTTP 请求,可以选择创建一个没有最大执行时间且不会超时的任务。

通过 Code Engine,您可以选择作业方式。 对应用了最长执行时间的作业使用缺省 task 方式。 对于这些作业,将根据作业重试限制重新启动失败的实例。

如果要创建可以无限期运行且不会超时的作业,请对作业使用 daemon 方式。 使用此方式时,作业的运行不会超时,并且会无限期地自动重新启动任何失败的实例。

当您使用 daemon 方式来运行作业时,如果希望 Code Engine 在发生故障时自动重新启动作业,请确保代码以非零退出代码停止。 如果与守护程序作业关联的容器映像以 0 退出代码结束,那么 Code Engine 假定该作业是有意停止的,并且不会重新启动该作业。 但是,如果作业由于意外原因而失败,并且与守护程序作业关联的容器映像使用非零退出代码退出,那么 Code Engine 会自动重新启动守护程序作业。 请参阅 为什么守护程序作业不会自动重新启动?

通过 Code Engine,您只需为所使用的资源付费。 当您的作业以 daemon 方式运行时,请注意该作业始终处于运行状态,直到您删除该作业为止。

创建并运行从控制台无限期运行的作业

此示例使用 IBM Cloud Code Engine 样本; 特别是 helloworld 样本。 当您创建引用 icr.io/codeengine/helloworld 样本的作业,并且还将方式指定为 daemon 时,此作业将在没有最长执行时间的情况下运行,并且失败的实例将无限期地重新启动。 如果未指定方式,那么缺省情况下,作业以 task 方式运行。

  1. 创建作业

    1. 打开 Code Engine 控制台。
    2. 选择 让我们开始
    3. 选择职位
    4. 输入职位名称,例如:myjob
    5. 从可用项目列表中选择一个项目。 您还可以 创建新的。 请注意,您必须具有所选项目才能创建作业。
    6. 选择要运行的代码。 您可以从 公共注册表专用注册表IBM Cloud Container Registry 中的映像创建作业。 您还可以从 存储库本地 源代码创建作业。 对于此示例,请使用 Code Engine 样本映像 icr.io/codeengine/helloworld
    7. 资源和缩放 部分中,为 弹性设置中的方式指定 daemon。 当您指定 daemon 方式时,此作业的作业运行可以无限期运行,并且不会超时。 这些作业运行没有重试限制。 为这些作业运行的任何作业都将自动重新启动而不受限制。
    8. 点击 “创建” 创建任务。
  2. 从“作业”页面中,单击 作业 选项卡以查看已定义作业的列表。 单击作业的名称以打开配置。

  3. 运行作业。

    1. 单击 提交作业 以打开“提交作业”对话框。 复审并 (可选) 更改缺省配置值,例如实例,CPU,内存,作业重试次数和作业超时。 有关这些选项的更多信息,请参阅 用于创建和运行作业的选项
    2. 单击 提交作业 以运行作业。 系统会在作业详细信息页面上显示作业实例的状态。 如果作业的任何实例未能运行,那么将无限期地自动重试这些实例。

    如需排除常见作业运行索引错误,请参阅 了解作业运行索引失败的原因

  4. (可选) 查看作业运行的日志。 您可以在控制台中为任务运行设置 "从控制台查看工作日志。 请注意,在 helloworld 样本的日志输出中,JOB_MODE 环境变量显示作业的方式。

使用 CLI 创建和运行无限期运行的作业

准备工作

此示例使用 IBM Cloud Code Engine 样本; 特别是 helloworld 样本。 当您创建引用了 icr.io/codeengine/helloworld 样本的作业并且还指定了 --mode daemon 时,此作业将在没有最长执行时间的情况下运行,并且失败的实例将无限期地重新启动。 如果未指定方式,那么缺省情况下,作业以 task 方式运行。

  1. 创建使用样本映像 icr.io/codeengine/helloworldmyjob-daemon 作业。 要以 daemon 方式将此样本映像作为作业运行,请指定 --mode daemon

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

    示例输出

    Creating job 'myjob-daemon'...
    

    下表概述了此示例中与 job create 命令配合使用的选项。 有关该命令及其选项的更多信息,请参阅 ibmcloud ce job create 命令。

    命令描述
    选项 描述
    --name 作业的名称。 请使用项目中唯一的名称。 此值是必需的。
    -名称必须以小写字母数字字符开头和结尾。
    -名称必须不超过 63 个字符,并且可以包含字母,数字和连字符 (-)。
    --image 用于运行作业的映像的名称。
    --mode 用于运行作业的方式。 有效值是 task (默认)和 daemon。 在 daemon 方式下,没有超时值,失败的实例将无限期重新启动。
  2. (可选) 使用 job get 命令来显示有关作业的信息。

    ibmcloud ce job get --name myjob-daemon
    

    示例输出

    [...]
    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. 运行作业。 此示例命令运行基于 myjob-daemon 作业配置的 myjobrun-daemon 作业运行。

    ibmcloud ce jobrun submit --name myjobrun-daemon --job myjob-daemon
    
  4. (可选) 查看作业运行的详细信息。

    ibmcloud ce jobrun get --name myjobrun-daemon
    

    示例输出

    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. (可选) 查看作业运行的日志。 通过 CLI,您可以针对作业运行的所有实例或特定作业运行实例 查看作业日志。 以下示例显示 myjobrun-daemon 作业运行的所有实例的作业日志。

    ibmcloud ce jobrun logs --name myjobrun-daemon
    

    示例输出

    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
    

现在,您的作业以 daemon 方式创建,该作业将无限期运行。 由于没有超时,并且失败的实例将无限期重新启动,因此在 daemon 方式下运行作业时,不允许使用 --maxexecutiontime--retrylimit 选项。

请注意,JOB_MODE 环境变量显示作业的运行方式。

停止无限期运行的作业

当您以 daemon 方式运行作业时,它可以无限期地运行,因为它运行时没有最大执行时间,并且任何失败的实例都会无限期地自动重试。 要停止处于 daemon 方式的作业,请删除特定作业运行或删除该作业。

从控制台停止无限期运行的作业

  • 要删除特定作业运行,请转至特定作业的作业页面。 转至 作业运行 选项卡。 删除您想要移除的工作运行。

  • 要删除作业,请转至“作业”页面,单击要除去的作业的名称。 删除作业将删除该作业,其配置以及与该作业相关联的任何作业运行。

使用 CLI 停止无限期运行的作业

  • 要删除使用 CLI 运行的特定作业,请使用 jobrun delete 命令。 您可以选择使用 -f 选项来强制删除作业运行而不进行确认。

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

    示例输出

    Deleting job run 'myjobrun-daemon'...
    OK
    
  • 要使用 CLI 删除作业,请使用 job delete 命令。 您可以选择使用 -f 选项来强制删除作业而不进行确认。 删除作业时,也会删除为此作业运行的任何作业。 以下示例将删除 myjob-daemon 作业,

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

    示例输出

    Deleting job 'myjob-daemon'...
    OK