Hitachi

JP1 Version 11 JP1/Advanced Shell 


5.1.7 別プロセスでの実行

ジョブ定義スクリプト内に次の書式が記述されていた場合,カレントプロセスとは異なるプロセスで実行します。別プロセスで変更した内容については,カレントプロセスには引き継がれません。

書式

詳細記載個所

command_1 | command_2

(d) パイプ

$(command) , ` command `

(b) コマンド置換

(command)

(10) コマンドのグループ化

command &

(11) そのほかのメタキャラクタ

command |&

(a) リダイレクト

別プロセスで実行する使用例を次に示します。

パイプ(|)による別プロセスの実行

パイプ(|)による別プロセス実行は,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版で違いがあります。

UNIX版と比較したWindows版の別プロセス実行の違いは次のとおりです。

重要

別プロセスで次のシェル標準コマンドを実行した場合,コマンドの実行結果が正常終了とエラー終了のどちらになるかは,カレントプロセスで実行した場合と異なります。異なる点は次のとおりです。

  • 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を送信してください。