ディレクトリにたくさんのPNG画像があります。これらの画像を圧縮するために実行するpngoutというアプリケーションがあります。このアプリケーションは、私が行ったスクリプトによって呼び出されます。問題は、このスクリプトが一度に1つずつ、次のように実行することです。
FILES=(./*.png)
for f in "${FILES[@]}"
do
echo "Processing $f file..."
# take action on each file. $f store current file name
./pngout -s0 $f R${f/.//}
done
一度に1つのファイルだけを処理するには、多くの時間がかかります。このアプリを実行した後、CPUがわずか10%であることがわかります。そこで、これらのファイルを4つのバッチに分割し、各バッチをディレクトリに配置して、4つのターミナルウィンドウと4つのプロセスから4を起動できることを発見しました。したがって、スクリプトの4つのインスタンスを同時に使用して、これらのイメージと仕事には1/4の時間がかかります。
2番目の問題は、イメージとバッチを分割し、スクリプトを4つのディレクトリにコピーし、4つのターミナルウィンドウを開いて、何とか…
する時間を失ったことです。何も分割せずに、1つのスクリプトでそれをどのように行うのですか?
つまり、2つのことを意味します。まず、bashスクリプトから、プロセスをバックグラウンドで起動するにはどうすればよいですか。 (最後に&を追加するだけですか?)2番目:4番目のタスクを送信した後にバックグラウンドへのタスクの送信を停止し、タスクが終了するまでスクリプトを待機させるにはどうすればよいですか?つまり、1つのタスクが終了したときに新しいタスクをバックグラウンドに送信し、常に4つのタスクを並列に保つということですか?そうしないと、ループがバックグラウンドで無数のタスクを実行し、CPUが詰まります。
承認された回答:
xargs
のコピーがある場合 -P
による並列実行をサポートします 、あなたは簡単に行うことができます
printf'%s
Linux