GNU/Linux >> Linux の 問題 >  >> Linux

並行する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つのターミナルウィンドウを開いて、何とか…

する時間を失ったことです。

何も分割せずに、1つのスクリプトでそれをどのように行うのですか?

つまり、2つのことを意味します。まず、bashスクリプトから、プロセスをバックグラウンドで起動するにはどうすればよいですか。 (最後に&を追加するだけですか?)2番目:4番目のタスクを送信した後にバックグラウンドへのタスクの送信を停止し、タスクが終了するまでスクリプトを待機させるにはどうすればよいですか?つまり、1つのタスクが終了したときに新しいタスクをバックグラウンドに送信し、常に4つのタスクを並列に保つということですか?そうしないと、ループがバックグラウンドで無数のタスクを実行し、CPUが詰まります。

承認された回答:

xargsのコピーがある場合 -Pによる並列実行をサポートします 、あなたは簡単に行うことができます

  printf'%s
Linux
  1. Bashスクリプトをデバッグする方法は?

  2. 特定の時間内に変更されたファイルを一覧表示するにはどうすればよいですか?

  3. コマンドオプションを覚える方法は??

  1. スクリプト実行の準備ができたときにサウンドを再生する方法は?

  2. Bash +セカンダリスクリプトとメインスクリプトの両方を終了する方法は?

  3. Bashスクリプトで文字列を分割する方法

  1. スクリプトを実行する方法??

  2. 時間コマンドでBashスクリプトの実行にかかる時間を確認する

  3. PHP スクリプトをテストする方法