以下のスクリプトを実行しています
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を使用しています。
ループをgrep
にパイプしたので、サブシェルで実行する必要があります。これはBashのマニュアルに記載されています:
パイプライン内の各コマンドは、個別のプロセスである独自のサブシェルで実行されます(コマンド実行環境を参照)。
パイプラインの最後のコマンドのlastpipe
シェルオプションを使用すると、これを回避できますが、他のコマンドは回避できません。いずれにせよ、パイプライン全体をバックグラウンドに配置しました。これにより、サブシェルも作成されます。
これを回避する方法はありません。本質的に実行していることは、機能するために個別のシェルプロセスを必要とします。パイプラインを無視しても、バックグラウンドプロセスを作成するには、プロセスを作成する必要があります。
問題がCPU使用率である場合、それはすべてを一度に実行することによって引き起こされます。の&
後を削除するとgrep
、すべてのコマンドが同時にではなく順番に実行されます。(パイプライン用に)サブシェルは引き続き作成されますが、その場合、それら自体が主な問題ではありません。それらを同時に実行する必要がある場合、CPU使用率の増加は、選択したトレードオフです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加