4つのジョブを同時に実行しています...どうすればいいですか?

4つのジョブを同時に実行しています...どうすればいいですか?

私のディレクトリには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つの端末ウィンドウを開くなどの作業に時間を無駄にしたことです。

何も分割せずにスクリプトでこれを達成するにはどうすればよいですか?

私の言葉は二つを意味します。まず、bashスクリプトからバックグラウンドでプロセスを開始する方法は? (最後に&?のみを追加してください。)2番目:4番目のジョブを送信した後にバックグラウンドでジョブの転送を停止し、スクリプトがジョブの終了を待つようにするにはどうすればよいですか。つまり、1つのタスクが終わったら、バックグラウンドで新しいタスクを送信し、常に4つのタスクを並列に保つことを意味しますか?そうしないと、ループは多数のタスクをバックグラウンドに送信し、CPUが詰まってしまいます。

ベストアンサー1

xargs並列実行をサポートするレプリカがある場合は、-P単に次のことができます。

printf '%s\0' *.png | xargs -0 -I {} -P 4 ./pngout -s0 {} R{}

他のアイデアについてはWooledge Bash Wikiにあります。部分プロセス管理の記事で必要な内容を正確に説明します。

おすすめ記事