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. 按一下 Create(建立 )以建立工作。
  2. 從「工作」頁面中,按一下 工作 標籤,以檢視已定義工作的清單。 按一下工作名稱以開啟配置。

  3. 執行工作。

    1. 按一下 提交工作,以開啟「提交工作」對話框。 檢閱並選擇性地變更預設配置值,例如實例、CPU、記憶體、工作重試次數及工作逾時。 如需這些選項的相關資訊,請參閱 用於建立及執行工作的選項
    2. 按一下 提交工作,以執行您的工作。 系統會在工作詳細資料頁面上顯示工作實例的狀態。 如果工作的任何實例無法執行,則會無限期地自動重試這些實例。

    如需排解常見的工作執行索引錯誤,請參閱 瞭解工作執行索引可能失敗的原因

  4. (選用) 檢視工作執行的日誌。 在控制台中,您可以 從控制台查看作業運行的作業日誌。 請注意,在 helloworld 範例的日誌輸出中,JOB_MODE 環境變數會顯示工作模式。

建立及執行使用 CLI 無限期執行的工作

開始之前

此範例使用 IBM Cloud Code Engine 範例; 特別是 helloworld 範例。 當您建立參照 icr.io/codeengine/helloworld 範例的工作並同時指定 --mode daemon 時,此工作會在沒有執行時間上限的情況下執行,且失敗實例會無限期重新啟動。 如果未指定模式,依預設,工作會以 task 模式執行。

  1. 建立 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 模式中,沒有逾時值,且失敗實例會無限期重新啟動。
  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