创建和运行无限期运行的作业
了解如何创建和运行可无限期运行且不会超时的 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
方式运行。
-
创建作业
- 打开 Code Engine 控制台。
- 选择 让我们开始。
- 选择职位。
- 输入职位名称,例如:
myjob
。 - 从可用项目列表中选择一个项目。 您还可以 创建新的。 请注意,您必须具有所选项目才能创建作业。
- 选择要运行的代码。 您可以从 公共注册表,专用注册表 或 IBM Cloud Container Registry 中的映像创建作业。 您还可以从 存储库 或 本地 源代码创建作业。 对于此示例,请使用 Code Engine 样本映像
icr.io/codeengine/helloworld
。 - 在 资源和缩放 部分中,为 弹性设置中的方式指定
daemon
。 当您指定daemon
方式时,此作业的作业运行可以无限期运行,并且不会超时。 这些作业运行没有重试限制。 为这些作业运行的任何作业都将自动重新启动而不受限制。 - 点击 “创建” 创建任务。
-
从“作业”页面中,单击 作业 选项卡以查看已定义作业的列表。 单击作业的名称以打开配置。
-
运行作业。
- 单击 提交作业 以打开“提交作业”对话框。 复审并 (可选) 更改缺省配置值,例如实例,CPU,内存,作业重试次数和作业超时。 有关这些选项的更多信息,请参阅 用于创建和运行作业的选项。
- 单击 提交作业 以运行作业。 系统会在作业详细信息页面上显示作业实例的状态。 如果作业的任何实例未能运行,那么将无限期地自动重试这些实例。
如需排除常见作业运行索引错误,请参阅 了解作业运行索引失败的原因。
-
(可选) 查看作业运行的日志。 您可以在控制台中为任务运行设置 "从控制台查看工作日志。 请注意,在
helloworld
样本的日志输出中,JOB_MODE
环境变量显示作业的方式。
使用 CLI 创建和运行无限期运行的作业
准备工作
- 设置 Code Engine CLI 环境。
- 创建和使用项目。
此示例使用 IBM Cloud Code Engine 样本; 特别是 helloworld
样本。 当您创建引用了 icr.io/codeengine/helloworld
样本的作业并且还指定了 --mode daemon
时,此作业将在没有最长执行时间的情况下运行,并且失败的实例将无限期地重新启动。
如果未指定方式,那么缺省情况下,作业以 task
方式运行。
-
创建使用样本映像
icr.io/codeengine/helloworld
的myjob-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
方式下,没有超时值,失败的实例将无限期重新启动。 -
(可选) 使用
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 [...]
-
运行作业。 此示例命令运行基于
myjob-daemon
作业配置的myjobrun-daemon
作业运行。ibmcloud ce jobrun submit --name myjobrun-daemon --job myjob-daemon
-
(可选) 查看作业运行的详细信息。
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
-
(可选) 查看作业运行的日志。 通过 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