Hitachi

JP1 Version 10 JP1/Advanced Shell


5.1.7 別プロセスでの実行【UNIX限定】

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

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

パイプ(|)による別プロセス実行は,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を実行
実行ジョブのジョブ実行ログファイルの内容
<省略>
********  JP1/Advanced Shell MESSAGE  ********
18:35:04 003001 KNAX0091-I ADSH003001 Job started.
18:35:04 003001 KNAX7901-I adshexec waits for all asynchronous processes at the end of the job.
18:35:04 003001 KNAX7902-I adshexec will run in non-tty stdin mode.
18:35:04 003001 KNAX6110-I Command ls=ls -lt(line=1) succeeded. rc=0 E-Time=0.000s C-Time=0.000s
18:35:04 003001 KNAX6112-I Command alias(line=2) succeeded. rc=0 E-Time=0.000s C-Time=0.000s
18:35:04 003001 KNAX6116-I Command $ls(line=3) succeeded. rc=0 E-Time=0.074s C-Time=0.010s
18:35:04 003001 KNAX6116-I Command grep(line=3) succeeded. rc=0 E-Time=0.072s C-Time=0.010s
18:35:04 003001 KNAX0098-I ADSH003001 Job ended. rc=0 E-Time=0.078s C-Time=0.020s

上記の書式で指定したコマンドに対して#-adsh_rc_ignoreコマンドの指定を有効にする場合,#-adsh_rc_ignoreコマンドの引数に指定するコマンド名は,置換前の文字列のベース名を指定する必要があります。

注意事項

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

  • letコマンド

    別プロセスで実行した場合,算術式を指定しないで実行すると,終了コード1で正常終了します。

  • exitコマンド,returnコマンド

    別プロセスで実行した場合,引数に数字以外を指定して実行すると,終了コード1で正常終了します。

  • getoptsコマンド

    別プロセスで実行した場合,オプションの終了を検出すると,終了コード1でエラー終了します。#-adsh_step_startコマンドのsuccessRC属性や,#-adsh_rc_ignoreコマンドを使用して,エラー終了とならないようにしてください。

  • readコマンド

    別プロセスで実行した場合,ファイルの終了(EOF)を検出すると,終了コード1でエラー終了します。#-adsh_step_startコマンドのsuccessRC属性や,#-adsh_rc_ignoreコマンドを使用して,エラー終了とならないようにしてください。

別プロセスでの実行中に,そのプロセスが終了要求シグナルを受信すると,シグナルの種類によっては別プロセスでの実行を継続する場合があります。別プロセスで実行した内容を確実に強制終了したい場合は,そのプロセスにSIGTERMを送信してください。