
特定の変数名の個々のインスタンスごとにコマンドを並列に実行する必要があります。変数は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
続行する前に、すべてのサブシェルが終了するまで親スクリプトが一時停止されます。ここでは説明目的でecho
、sleep
および文がwait
使用されました。
答え2
あなたがやっていることはうまくいくでしょう。これができる場合:
$ KMMX.csh
これにより、GNU Parallelもスクリプトを実行できる必要があります。最初のデバッグステップはparallel
を使用して実行することです--dry-run
。これにより、何が実行されているかを教えてくれます。
cat run.txt | parallel --dry-run
しかし、あなたの質問には私を混乱させるいくつかの点があります。
- 質問のタイトルに記載されていますが、スクリプトを対話型シェルと
bash
呼びますが、スクリプトファイルは?*.csh
bash
csh
- ファイルをのディレクトリに入れたとは言いませんでしたが、
$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)に移動するのに数時間を費やしてください。
あなたのコマンドラインはあなたを愛するでしょう。