5.1.7 別プロセスでの実行
ジョブ定義スクリプト内に次の書式が記述されていた場合,カレントプロセスとは異なるプロセスで実行します。別プロセスで変更した内容については,カレントプロセスには引き継がれません。
書式 |
詳細記載個所 |
---|---|
command_1 | command_2 |
|
$(command) , ` command ` |
|
(command) |
|
command & |
|
command |& |
別プロセスで実行する使用例を次に示します。
- パイプ(|)による別プロセスの実行
パイプ(|)による別プロセス実行は,PIPE_CMD_LASTパラメーターの指定によって動作が異なります。
- (例)
hostname | read STR
・PIPE_CMD_LASTパラメーターにCURRENTを指定した場合
hostnameコマンドは別プロセスで実行されますが,readコマンドはカレントプロセスで実行されます。
・PIPE_CMD_LASTパラメーターにOTHERを指定した場合
hostnameコマンド,readコマンドともに別プロセスで実行されます。そのため,変数STRにはhostnameコマンドの結果が代入されません。
- コマンド置換($()や``)による別プロセスの実行
- (例)
$(date '+%Y%m%d') #dateコマンドの出力結果を名称とするコマンドを実行 `date '+%Y%m%d'` #dateコマンドの出力結果を名称とするコマンドを実行
- |&によるバックグラウンドプロセスの実行
- (例)
echo abc |& # 文字列abcをバックグラウンドプロセス実行で出力 sleep 1 read -p STR # バックグラウンドプロセスで出力した内容を読み込む echo $STR
- コマンドのグループ化によるサブシェル実行
- (例)
(TZ=GMT; export TZ; date) # 環境変数TZを一時的にGMTに変更して時刻を出力
- &によるバックグラウンド実行
- (例)
sleep 10 &
文字列の置換は別プロセス側で行います。そのため,例えば上記の書式で変数に代入した文字列をコマンドとして実行すると,ジョブ実行ログファイルのコマンド実行結果には置換前の変数名が出力されます。ただし,エイリアスはカレントプロセスで解決した上で実行するため,エイリアス解決後のコマンド名が出力されます。
- ジョブ定義スクリプトの内容
ls="ls -lt" # 変数lsに"ls -lt"を代入 alias gt="grep test" # エイリアス名gtに"grep test"を定義 $ls | gt # ls -lt | grep testを実行
- 実行ジョブのジョブ実行ログファイルの内容
<省略> ******** ジョブコントローラのメッセージ出力 ******** 16:01:06 152285 KNAX0091-I ADSH152285 ジョブが開始しました。 16:01:06 152285 KNAX7901-I ジョブコントローラは,ジョブ終了時にすべての非同期実行プロセスの完了を待ちます。 16:01:06 152285 KNAX7902-I ジョブコントローラは,"端末入力モード"で動作します。 16:01:06 152285 KNAX6110-I コマンド(ls=ls -lt, 行番号=1)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s 16:01:06 152285 KNAX6112-I コマンド(alias, 行番号=2)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s 16:01:06 152285 KNAX6116-I コマンド($ls, 行番号=3)が正常終了しました。rc=0 E-Time=0.001s C-Time=0.000s 16:01:06 152285 KNAX6116-I コマンド(/opt/jp1as/cmd/grep, 行番号=3)が正常終了しました。rc=0 E-Time=0.001s C-Time=0.000s 16:01:06 152285 KNAX0098-I ADSH152285 ジョブが終了しました。rc=0 E-Time=0.013s C-Time=0.000s
上記の書式で指定したコマンドに対して#-adsh_rc_ignoreコマンドの指定を有効にする場合,#-adsh_rc_ignoreコマンドの引数に指定するコマンド名は,置換前の文字列のベース名を指定する必要があります。
次のコマンドは別プロセスで実行しないでください。
種類 |
コマンド |
---|---|
シェル運用コマンド |
adshfile |
adshmsvcd【Windows限定】 |
|
adshmsvce【Windows限定】 |
|
adshmdctl【UNIX限定】 |
|
シェル拡張コマンド |
adshecho |
adshread |
|
adshjoberr |
|
adshcmdrc |
|
スクリプト拡張コマンド |
すべて |
Windows版とUNIX版の差異
次のコマンドを別プロセス化する場合,別プロセス実行にはWindows版とUNIX版で違いがあります。
-
シェル標準コマンド
-
スクリプト制御文
-
シェル拡張コマンド
-
スクリプト予約語コマンド
-
代入式
-
関数
-
コマンド置換を含むコマンド(例:cmdA $(cmdB) (cmdA,cmdBは外部コマンドとする))
-
別プロセスで,次のケースでは,定義されたエイリアスが有効になります。
定義されたエイリアスによる置換を実行したくない場合は,コマンド名をクォーテーション('または")で囲んでください。
ケース1
次のすべてに該当するとき。
-
エイリアスの定義がされていないときに読み込んだスクリプトを別プロセスで実行する。
-
エイリアスを定義する。
-
別プロセスで実行するコマンドが,定義されたエイリアスの置換対象である。
例:
fn(){ (ls) #3の条件 } alias ls='ls -l' #2の条件 fn #1の条件
ケース2
次のすべてに該当するとき。
-
別プロセスでエイリアスを定義する。
-
1と同一のプロセスで実行するコマンドが,定義されたエイリアスの置換対象である。
例:
(alias ls='ls -l' #1の条件 ls) #2の条件
-
UNIX版と比較したWindows版の別プロセス実行の違いは次のとおりです。
-
ルートジョブが拡張出力モードで,別プロセスでエラーが発生した場合,エラーの情報は標準エラー出力に出力されます。また,エラー情報にファイル名と行番号は出力されません。
-
子孫ジョブを別プロセス実行した際に,子孫ジョブはSPOOLJOB_CHILDJOBパラメーターにDELETEを指定した場合と同様の動作をする場合があります。
-
別プロセスは環境ファイルの設定内容を使用します。そのため,環境変数ADSH_ENVに相対パスを指定したとき,カレントディレクトリを移動した状態で別プロセスを起動すると,環境ファイルを読み込めずにエラー終了します。
-
関数を別プロセス実行した場合,それ以降の関数情報配列の関数呼び出し行番号配列は,関数を別プロセス実行した行番号になります。
-
別プロセスにファイルディスクリプタが引き継がれないで,クローズされます。例えば,別プロセスで実行するスクリプト内で,親プロセスがオープンしている最中のファイルディスクリプタに対して,別プロセスが再度オープンしないで入出力を行うとエラーになります。標準出力と標準エラー出力は再度オープンされた状態です。
-
別プロセスは最小出力モードで動作します。そのため,別プロセスは情報メッセージを表示せず,エラーメッセージの出力先も最小出力モードに従います。
-
別プロセスはSPOOLJOB_CREATEパラメーターにNOを指定した状態で動作します。SPOOLJOB_CREATEパラメーターにNOを指定した状態の動作については,「(a) スプールジョブ作成抑止機能の使用有無を決定する」を参照してください。
-
#-adsh_path_varコマンドで指定した変数は,別プロセスではパスを扱う変数として定義されません。別プロセスでもパスを扱う変数として定義したい場合は,PATH_CONV_VARパラメーターとPATH_CONV_NOVARパラメーターで指定してください。
- 重要
別プロセスで次のシェル標準コマンドを実行した場合,コマンドの実行結果が正常終了とエラー終了のどちらになるかは,カレントプロセスで実行した場合と異なります。異なる点は次のとおりです。
letコマンド
別プロセスで実行した場合,算術式を指定しないで実行すると,終了コード1で正常終了します。
exitコマンド,returnコマンド
別プロセスで実行した場合,引数に数字以外を指定して実行すると,終了コード1で正常終了します。
getoptsコマンド
別プロセスで実行した場合,オプションの終了を検出すると,終了コード1でエラー終了します。#-adsh_step_startコマンドのsuccessRC属性や,#-adsh_rc_ignoreコマンドを使用して,エラー終了とならないようにしてください。
readコマンド
別プロセスで実行した場合,ファイルの終了(EOF)を検出すると,終了コード1でエラー終了します。#-adsh_step_startコマンドのsuccessRC属性や,#-adsh_rc_ignoreコマンドを使用して,エラー終了とならないようにしてください。
UNIX版では,別プロセスでの実行中に,そのプロセスが終了要求シグナルを受信すると,シグナルの種類によっては別プロセスでの実行を継続する場合があります。別プロセスで実行した内容を確実に強制終了したい場合は,そのプロセスにSIGTERMを送信してください。