スクリプトは同時に複数のプロセスを同時に実行できますか?

スクリプトは同時に複数のプロセスを同時に実行できますか?

私のコードで複数のプロセスを同時に実行したいです。これ以下の例コードとソースは次のとおりです。スタックエクスチェンジ(Unix&Linux)ウェブサイト。

> #!/bin/bash
> for i in $(cat lis.txt); do
>      echo "$i"
>      wait
>      mkdir "$i"
>  done

この単純なコードは、テキストファイルに含まれる名前のリストからディレクトリリストを生成するように設計されています。コードを実行すると、フォルダが1つずつ生成されます。すべてのフォルダを同時に作成するには、つまりすべてのタスクを同時に実行するには、このコードをどのように変更する必要がありますか?

答え1

スクリプトはの各行のディレクトリを作成しますlist.txt。空白を処理できますが、他の奇妙な文字(例:\r or\ t`などは処理できませんが、ここでは問題ではありません):

#!/usr/bin/env bash
while IFS= read -r dir
do
  mkdir -- "$dir" &
done < list.txt

&スクリプトが完了するのを待たずにすぐに続行するようにタスクをバックグラウンドに送信しますmkdir。これはほとんど確実に検出できませんが、mkdir他の作業では重要です。

後で参照できるように任意の文字を処理できる必要がある場合は、代わりにを使用してくださいread -r。また、より複雑な並列化タスクについては、次の点を確認してください。GNUパラレル

答え2

GNU Parallelがある場合は、次のいずれかを実行できます。

parallel mkdir :::: list.txt
parallel -a list.txt mkdir
cat list.txt | parallel mkdir 

すべての新しいコンピュータにはマルチコアがありますが、ほとんどのプログラムは本質的にシリアルなので、マルチコアを使用しません。しかし、多くのタスクは非常に並列化可能です。

  • 複数のファイルで同じプログラムを実行する
  • ファイルの各行に対して同じプログラムを実行します。
  • ファイルの各ブロックに対して同じプログラムを実行します。

GNU Parallelは、同じコンピュータまたはSSHを介してアクセスできる複数のコンピュータでタスクを並列に簡単に実行できる汎用の並列ハンドラです。

4つのCPUで32の異なるジョブを実行する場合は、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。

簡単なスケジューリング

代わりに、GNU Parallel はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。

GNU並列スケジューリング

インストールする

ディストリビューションにGNU Parallelがパッケージされていない場合は、rootアクセスなしでプライベートインストールを実行できます。これは10秒で完了できます。

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

その他のインストールオプションについては、以下を参照してください。http://git.savannah.gnu.org/cgit/parallel.git/tree/README

詳細

より多くの例を見る:http://www.gnu.org/software/parallel/man.html

紹介ビデオを見る:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

このチュートリアルを見てください。http://www.gnu.org/software/parallel/parallel_tutorial.html

サポートを受けるには、メールリストに参加してください。https://lists.gnu.org/mailman/listinfo/parallel

関連情報