異なる名前を持つ複数のbashスクリプトを並列に実行する

異なる名前を持つ複数のbashスクリプトを並列に実行する

特定の変数名の個々のインスタンスごとにコマンドを並列に実行する必要があります。変数は4個でも100個でもかまいません。たとえば、次のような特定のデータセットがあるとします。

datanames='KQPW KMMX KMKO KZAO'

互いに並列に実行される各プロセスに対してプロセスを実行する必要があります。つまり、KQPWに対してprocess1を実行し、KMMXに対してprocess1を実行する必要があるなどの操作が行われます。 Process1 には変数名に基づく入力が必要です。

私が読んだチュートリアルと予備調査でGNU 'パラレル'コマンドをインストールしました。すべてのデータ名を「run.txt」というテキストファイルに入れました。

KQPW.csh
KMMX.csh
KMKO.csh
KZAO.csh

これらの各.cshファイルには、process1の必須入力として一意の変数名を使用してprocess1を呼び出すコマンドが含まれています。問題は、これら4つのコマンドを同時に実行する方法です。私は試した:

cat run.txt | parallel

しかし、何も起こりませんでした。どんなアイデアがありますか?

答え1

外部ツールを使用せずに並列記述に基づいて実行スクリプトをすばやく実証します。

#!/bin/bash
datanames='KQPW KMMX KMKO KZAO'
datanamesarray=($datanames)
for item in ${datanamesarray[@]}; do
  ( ./${item}.csh; sleep 10 ) &
done
echo waiting..
wait
echo done

waiting..すべてのサブシェルが並列に実行されるため、このコマンドを実行してから10秒の遅延が発生します。wait続行する前に、すべてのサブシェルが終了するまで親スクリプトが一時停止されます。ここでは説明目的でechosleepおよび文がwait使用されました。

答え2

あなたがやっていることはうまくいくでしょう。これができる場合:

$ KMMX.csh

これにより、GNU Parallelもスクリプトを実行できる必要があります。最初のデバッグステップはparallelを使用して実行することです--dry-run。これにより、何が実行されているかを教えてくれます。

cat run.txt | parallel --dry-run

しかし、あなたの質問には私を混乱させるいくつかの点があります。

  • 質問のタイトルに記載されていますが、スクリプトを対話型シェルとbash呼びますが、スクリプトファイルは?*.cshbashcsh
  • ファイルをのディレクトリに入れたとは言いませんでしたが、$PATHパス(たとえば)を使用してスクリプトを参照しませんでした./KMMX.csh。これがうまくいかない理由を説明します。ただし、エラーメッセージが表示されます。
  • chmod +xあなたはファイルを所有していると言及していません。これがうまくいかない理由を説明します。ただし、エラーメッセージが表示されます。

しかし、何よりも、あなたが必要以上に仕事を難しくしていることが心配です。 GNU Parallelはテンプレートからコマンドを作成するように設計されており、*.cshデータ名のみを変更すると、ファイルもテンプレートに書き込まれるように聞こえます。

私の考えでは、設定を次のように変更できるようです。

$ parallel doit {} ::: KQPW KMMX KMKO KZAO

doitデータ名をパラメータとして使用するスクリプト/関数はどこにありますか?

迅速な紹介のために紹介ビデオを見ることをお勧めします。http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1次に、オプションリストの後ろの例を見てください(LESS = + / EXAMPLE:man並列を使用)。これにより、GNUの並列機能に関するアイデアを得ることができます。その後、このチュートリアル(manparallel_tutorial)に移動するのに数時間を費やしてください。

あなたのコマンドラインはあなたを愛するでしょう。

関連情報