建立及執行無限期執行的工作
瞭解如何建立及執行可無限期執行且不會逾時的 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模式時,此工作的工作執行可以無限期地執行,且它們不會逾時。 這些工作執行沒有重試限制。 這些工作的任何工作執行都會自動重新啟動,不受限制。 - 按一下 Create(建立 )以建立工作。
-
從「工作」頁面中,按一下 工作 標籤,以檢視已定義工作的清單。 按一下工作名稱以開啟配置。
-
執行工作。
- 按一下 提交工作,以開啟「提交工作」對話框。 檢閱並選擇性地變更預設配置值,例如實例、CPU、記憶體、工作重試次數及工作逾時。 如需這些選項的相關資訊,請參閱 用於建立及執行工作的選項。
- 按一下 提交工作,以執行您的工作。 系統會在工作詳細資料頁面上顯示工作實例的狀態。 如果工作的任何實例無法執行,則會無限期地自動重試這些實例。
如需排解常見的工作執行索引錯誤,請參閱 瞭解工作執行索引可能失敗的原因。
-
(選用) 檢視工作執行的日誌。 在控制台中,您可以 從控制台查看作業運行的作業日誌。 請注意,在
helloworld範例的日誌輸出中,JOB_MODE環境變數會顯示工作模式。
建立及執行使用 CLI 無限期執行的工作
開始之前
- 設定 Code Engine CLI 環境。
- 建立並使用專案。
此範例使用 IBM Cloud Code Engine 範例; 特別是 helloworld 範例。 當您建立參照 icr.io/codeengine/helloworld 範例的工作並同時指定 --mode daemon 時,此工作會在沒有執行時間上限的情況下執行,且失敗實例會無限期重新啟動。
如果未指定模式,依預設,工作會以 task 模式執行。
-
建立
myjob-daemon工作,其使用範例映像檔icr.io/codeengine/helloworld。 若要以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