Hitachi

Advanced Shell 


3.11.1 ジョブの強制終了の方法

〈この項の構成〉

(1) 強制終了の方法

ジョブの強制終了には次の2とおりの方法があります。

ジョブを強制終了すると,ジョブコントローラは実行中の子プロセスまたは子孫プロセスを強制終了します。詳細は,「(2) 子プロセスまたは子孫プロセスの強制終了」を参照してください。

子プロセスまたは子孫プロセスを強制終了したあと,割り当てたファイルの後処理をして後続のジョブステップ・コマンドを一切実行しないで終了します。後続ジョブステップのrun属性にabnormalやalwaysが指定されていても実行しません。ジョブを強制終了すると,UNIXではadshexecコマンドがシグナルによってエラー終了します。UNIXでのSIGTERM受信時のジョブの動作については「3.11.2 シグナル受信時の動作【UNIX限定】」,Windowsでの強制終了時のジョブの動作については「3.11.3 強制終了時のジョブの動作【Windows限定】」を参照してください。

重要

Windowsの場合,adshexecコマンドの起動時にadshexecsubコマンドをあわせて起動し,adshexecコマンドを強制終了すればadshexecsubコマンドも終了します。そのため,adshexecsubコマンドは強制終了しないでください。adshexecsubコマンドを強制終了すると,次の現象が発生する場合があります。

  • 実行中の子孫プロセスが終了されません。

  • 一時ファイルが残ったままとなる場合があります。

これらの現象が発生した場合は,taskkillコマンドやタスクマネージャーを使用して子孫プロセスを強制終了させ,一時ファイルを手動で削除してください。

重要

Windows環境Advanced Shellのジョブコントローラでは,孫プロセスの強制終了のためにジョブオブジェクトを使用しているため,次の2点に注意してください。

  • ジョブコントローラから生成した子プロセスをジョブオブジェクトに関連づけることはできません。

  • ジョブコントローラプロセスが,すでにジョブオブジェクトに関連づけられていた場合,ジョブの強制終了でジョブコントローラの子プロセスが生成したプロセスは終了しません。

重要

Windowsでは,子孫プロセスを生成する外部コマンドを実行するジョブを強制終了した場合,孫以下のプロセスが同時に256個以上存在すると,メッセージKNAX6381-Eを出力してスプールジョブディレクトリの名称変更が失敗することがあるため,次の3点に注意してください。

  • 失敗したスプールジョブディレクトリを参照する場合は,直後のメッセージKNAX6382-Iに出力されるディレクトリ名を参照してください。

  • 名称変更に失敗したスプールジョブディレクトリはadshhkコマンドでは削除されません。削除する場合は,手動で削除してください。

  • 実行環境でスプールジョブディレクトリの名称変更に失敗したジョブは,adshevtoutコマンドでジョブ定義スクリプト稼働実績情報を出力しません。

(2) 子プロセスまたは子孫プロセスの強制終了

ジョブを強制終了すると,ジョブコントローラは子プロセスまたは子孫プロセスを強制終了してからジョブを終了します。

(a) UNIXの場合

ジョブの入力モードによって,子プロセスまたは子孫プロセスの強制終了の方法が次のとおり異なります。

  • 端末入力モード

    adshexecコマンドの子プロセスだけにSIGTERMを送信します。adshexecコマンドの孫プロセス以下には,SIGTERMを送信しません。これらのプロセスの後処理を実行したい場合は,次のどちらかの方法でジョブを作成・実行してください。

    • 外部コマンドをユーザーが作成する場合,SIGTERMを受信したら子孫プロセスにも自動的にSIGTERMを送信するなど,子孫プロセスの後処理を外部コマンド側で実行するようあらかじめ設計してください。

    • 端末入力モードのジョブを強制終了する場合,「Ctrl+C」や「Ctrl+\」などの操作は,adshexecコマンドだけでなく,孫プロセス以下を含むすべての子孫プロセスが対象になります。

    強制終了後に孫プロセス以下が残ってしまった場合は,残ってしまったプロセスのプロセスIDをpsコマンドで確認し,killコマンドによって手動で終了させてください。

  • 非端末入力モード

    adshexecコマンドの子孫プロセスにSIGTERMを送信します。

(b) Windowsの場合

adshexecコマンドの子孫プロセスをTerminateProcess関数およびTerminateJobObject関数で強制終了します。ジョブの入力モードによる強制終了方法の差異はありません。

(3) Ctrl+Cなどの操作に関する注意事項【UNIX限定】

非端末入力モードでジョブを実行した場合,ルートジョブ,子孫ジョブ,およびほかに起動した外部コマンドを「Ctrl+C」や「Ctrl+\」などの操作で一度に強制終了させることができないときがあります。これらのジョブおよびコマンドを一度にすべて強制終了させたいときは,ログインシェル直下のルートジョブに対して,killコマンドでSIGTERMなどの終了要求シグナルを送信してください。

注※

非端末入力モードでジョブを実行した場合,adshexecコマンドのプロセスとその子プロセスとは,別々のプロセスグループになります。そのため,ログインシェルからジョブを実行中に「Ctrl+C」や「Ctrl+\」などの操作を実行した場合,現在フォアグラウンドにいるプロセスグループに対してだけ,SIGINTやSIGQUITが送られます。

シグナルを受信したジョブの子孫プロセスとして動作するジョブおよび外部コマンドは強制終了されますが,親プロセスやそれより上位のプロセスとして動作するジョブおよび外部コマンドは強制終了されません。