うまくいかない

うまくいかない

次のスクリプトを実行しています。

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使用量の増加を選択することをお勧めします。

おすすめ記事