次のスクリプトを実行しています。
LOGDIR=~/curl_result_$(date |tr ' :' '_')
mkdir $LOGDIR
for THREADNO in $(seq 20)
do
for REQNO in $(seq 20)
do
time curl --verbose -sS http://dummy.restapiexample.com/api/v1/create --trace-ascii ${LOGDIR}/trace_${THREADNO}_${REQNO} -d @- <<EOF >> ${LOGDIR}/response_${THREADNO} 2>&1
{"name":"emp_${THREADNO}_${REQNO}_$(date |tr ' :' '_')","salary":"$(echo $RANDOM%100000|bc)","age":"$(echo $RANDOM%100000|bc)"}
EOF
echo -e "\n-------------------------------" >> ${LOGDIR}/response_${THREADNO}
done 2>&1 | grep real > $LOGDIR/timing_${THREADNO} &
done
しばらくしてbashプロセスがないことを確認すると、20(1または21ではありません)が表示されます。
ps|grep bash|wc -l
問題は、内部ループを囲むために角括弧「()」を使用しないため、新しいシェルプロセスを作成してはいけません。 CPU使用率が100%に近いときに新しいシェルを作成しないようにします。これが重要かどうかはわかりませんが、Cygwinを使用しています。
ベストアンサー1
ループをパイプに入れたので、サブシェルgrep
で実行する必要があります。これが言及されましたバッシュマニュアルから:
パイプラインの各コマンドは、個別のプロセスである独自のサブシェルで実行されます(参照:コマンド実行環境)
これは次の方法で回避できます。lastpipe
住宅オプション~のため決定的なパイプラインにはコマンドがありますが、他のコマンドにはありません。とにかく、パイプライン全体をバックグラウンドに配置しました。返品サブシェルを作成します。
この問題を解決する方法はありません。デフォルトでは、実行する操作には別のシェルプロセスが必要です。バックグラウンドプロセスを作成するには、パイプを無視してもプロセスを作成する必要があります。
問題がCPU使用率であれば、すべてを同時に実行したために発生しました。削除すると、すべてのコマンド&
がgrep
同時に実行されるのではなく、順次実行されます。サブシェルはまだ生成されますが(パイプ用)この場合、それ自体は主な問題ではありません。同時に実行する必要がある場合は、CPU使用量の増加を選択することをお勧めします。