これはかなり不格好ですが、私にとってはうまくいきます。私は3つのスクリプトを持っています。
cmd.sh は「somecommand」です。これはテスト スクリプトのみです。
#!/bin/ksh
sleep 10
echo "End of job $1"
以下はwrapper.sh
、単一のコマンドを実行し、出力をキャプチャし、完了したら親に通知し、結果を stdout に書き込みます。
#!/bin/ksh
sig=$1
shift
var=$($@)
kill -$sig $PPID
echo $var
親スクリプトは次のとおりです。
#!/bin/ksh
trap "read -u3 out1" SIGUSR1
trap "read -p out2" SIGUSR2
./wrapper.sh SIGUSR1 ./cmd.sh one |&
exec 3<&p
exec 4>&p
./wrapper.sh SIGUSR2 ./cmd.sh two |&
wait
wait
echo "out1: $out1, out2: $out2"
echo "Ended"
最初のものが中断されるため、2x 待ちます。
親スクリプトでは、実行するコマンドと引数を渡して、ジョブごとに 1 回ずつ、2 回ラッパーを実行しています。「バックグラウンドへのパイプ」という|&
意味 - コプロセスとして実行されます。
2 つのexec
コマンドは、パイプ ファイル記述子を fds 3 および 4 にコピーします。ジョブが終了すると、ラッパーはメイン プロセスにパイプを読み取るように通知します。trap
シグナルは、適切な子プロセスのパイプを読み取り、結果のデータを収集する を使用してキャッチされます。
かなり複雑で不格好ですが、うまくいくようです。