無期限に実行されるジョブの作成と実行
無期限に実行され、タイムアウトしない Code Engine ジョブの作成および実行方法について学びます。
通常、ジョブは 1 回実行し、最大実行時間で終了するように設計されています。
ただし、サード・パーティー・データ・ストアを常にポーリングする必要があるとします。 アプリケーションを作成することもできますが、 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、メモリー、ジョブ再試行回数、ジョブ・タイムアウトなどのデフォルト構成値を確認し、必要に応じて変更します。 これらのオプションについて詳しくは、ジョブを作成および実行する際のオプションを参照してください。
- **「ジョブの実行依頼」**をクリックしてジョブを実行します。 「ジョブの詳細 (job details)」ページに、ジョブのインスタンスの状況が表示されます。 ジョブのいずれかのインスタンスが実行に失敗した場合、これらのインスタンスは無期限に自動的に再試行されます。
一般的なジョブ実行インデックスのエラーのトラブルシューティングについては、「 ジョブ実行インデックスが失敗する原因の理解 」を参照してください。
-
(オプション) ジョブ実行のログを表示します。 コンソールから、実行した ジョブのログを見る ことができます。
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