ディレクトリに多数の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を起動できることを発見しました。ジョブは時間の1/4かかります。
2番目の問題は、イメージとバッチを分割し、スクリプトを4つのディレクトリにコピーして、4つのターミナルウィンドウを開き、bla bla ...
何も分割せずに、1つのスクリプトでそれをどのように行いますか?
私は2つのことを意味します:最初にbashスクリプトからどのようにバックグラウンドにプロセスを起動しますか?(最後に追加するだけですか?)2番目:4番目のタスクを送信した後、バックグラウンドへのタスクの送信を停止し、タスクが終了するまでスクリプトを待機させるにはどうすればよいですか?つまり、1つのタスクが終了すると新しいタスクをバックグラウンドに送信するだけで、常に4つのタスクを並行して保持しますか?そうしないと、ループは何十億ものタスクをバックグラウンドで起動し、CPUが詰まります。