私のコードで複数のプロセスを同時に実行したいです。これ以下の例コードとソースは次のとおりです。スタックエクスチェンジ(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 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