問題タブ [gnu-parallel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bash - GNU Parallel and Bash functions: マニュアルの簡単な例を実行する方法
bash関数を簡単に並列化できると思うケースがあるので、GNU Parallelを学ぼうとしています。それで、学習しようとして、例があるGNU Parallelマニュアルに行きました...しかし、それを機能させることさえできません! ウィット:
ご覧のとおり、単純な例を実行することすらできません。したがって、私はおそらく驚くほど愚かで基本的なことをしています...しかし、私は途方に暮れています.
ETA: コメンター (chmod +x、set -vx) が示唆するように:
ETA2: 注意してください。スクリプトで「doit 1」を呼び出すだけで、それが実行されます。関数は有効ですが、エクスポートされていませんか?
gnu-parallel - GNU Parallel: 入力が端末から読み取られるときの警告を抑制します
入力が端末から読み取られると、GNU Parallel は常に警告を表示します。
しかし、端末から読みたい場合もあります (たとえば、エントリごとに別の場所からコピー & ペーストする場合)。この警告をオフにすることはできますか? man parallel
またはにそのようなオプションが見つかりませんでしたman parallel_tutorial
。
2>/dev/null
他のプログラムからの警告メッセージもオフになるため、 のような安価なソリューションは必要ないことに注意してください。たとえば、次の単純なスクリプトを考えてみましょう。
に出力されたメッセージstderr
はすべて抑制されます。
目的の効果を達成するために、cat
いくつかのことを実行できることに気付きました. read </dev/tty
しかし、元の質問に焦点を当てましょう。
macos - Mac OS X: GNU parallel がリモート サーバーのコア数を検出できない
大学のサーバーでリモートでいくつかのテストを実行できるように、自作を使用して Mac に GNU パラレルをインストールしました。私はチュートリアルをすばやく実行していましたが、実行すると
メッセージを受け取りました
おそらく関連して、パスに並列を追加したことはなく、「並列」は認識されたコマンドではないという警告が表示されましたが、並列はとにかく実行され、まだ正しくエコーされました。この特定のサーバーには 16 個のコアがありますが、それらを認識するために並列化するにはどうすればよいですか?
parallel-processing - ファイルから読み取った 2 つの引数を指定してコマンド (phantomjs) を起動します。
シェルからコマンド (phantomjs) を起動するための 2 つの引数である、各行に 2 つの文字列を含むファイルがあります。GNU parallel を使用して、各行に対してコマンドを起動します。ここで、手動で起動する場合は、次のように記述します。
そしてすべてが機能します。しかし、並列で試してみると、何かがうまくいかない:
これが出力されます
なぜそれが機能しないのか、リンクの後に冗長モード(最初の2行)に\
文字があるのか 理解できません。
cat -vet 出力:
arrays - GNU Parallel での連想配列へのアクセス
Bash で次のことを想定します。
シーケンスではなく、連想配列のインデックスを使用することを確認して、GNU Parallel でも同じことができますか? 配列をエクスポートできないという事実は、不可能ではないにしても、これを困難にしますか?
bash - running -- 最初は不明 -- 並行して実行された bash コマンドの数
正確な数と正確な数を事前に知らなくても、一連のコマンドを実行できるようにしたいと考えています。これらのコマンドは通常、それぞれ数時間または数日かかる計算です。コマンドはクラスターで実行され、ノードを事前に予約する必要があるため、事後的にコマンドのリストを変更する方法が必要です。
(それが何であれ)(i)実行中にコマンドを読み取り、プロセッサが解放されるまでコマンドを起動し続け、(ii)コマンドが実行されなくなったら終了することを望みます。
これを達成する最も簡単な方法は何ですか?
編集:これは機能します(GNUパラレルで)
まず、回答で示唆されているように、変更parallel
(例: /usr/bin/parallel
)、変更
に
次に、次のようにテストします。
ノート
- 「-u」は「グループ解除」用であり、すべての行が読み込まれ、実行され、表示され、procs が利用可能になります。
- "-E EXIT" は kill できるようにするためのものです: EXIT を書いた後、'tail -f' が死ぬように別の (任意の) 文字列を書かなければなりません。(上記の変更を行わないと、パラレルはストリームを開いたままにし、これは機能しません)
- ストリームが空で CPU がアイドル状態の場合は終了しません
if(items_processed>0 && nprocs_running==0) exit
。その後、テールを殺すという問題がまだありますが、これは、入力ファイルに定期的に偽の書き込みを行うことで、醜い方法でハッキングされる可能性があります。
私が試したこと
私が考えることができる最も単純な構文は、GNU parallel を使用して次のようなものになります。
これはうまく機能します...ただし、コマンドの数がCPUの数よりも少ない場合(これは一般的です。16 cpuマシンで10プロセスから開始する場合があります)、EOFが発生し、ストリームを閉じると表示されますさらにコマンドを追加する方法はありません。したがって、実行中のコマンドが終了するたびに終了します。
EOFの問題を回避するために、テールでストリームをたどることができると思いました
たとえば、次の簡単なテストのように:
これは非常に近くなり、コマンドを追加できますが、ファイルは閉じません。ただし、最後まで到達せず、「EXIT」を読み取っても停止せず、代わりにハングします。理由はわかりません。ブロックで読み込んでいるのかもしれません(??) また、すべてのプロセスが終了し、ファイルに何もする必要がなくなっても停止しません。
(これは、回答で提案されているバグに関連している可能性があるので編集してください)
または、「wait PID」を使用して各 CPU のいくつかの子プロセスを起動することを想像できますが、それは複雑すぎるように見えます。さらに、これはまさに GNU/parallel が行うべきことのようです。
助けや提案をありがとう!
ここの コメントに基づいて編集します。これは少なくとも終了しますが、最初にキーワード「EXIT」が必要です。
このスレッドで提案されているように、「parallel -j2」の代わりに「xargs -P2」を使用することもできますが、それでは問題は解決しません。
gnu-parallel - GnuParallel: クラスター上でスクリプトを並列化すると、スクリプトはマスター ノードにファイルを書き込みます
テキストファイル内のディレクトリ名のリストを入力として受け取る単純なbashスクリプトがあります。これらのディレクトリを 1 つずつトラバースし、出力をpwd
ファイルにコピーして、このファイルを結果ディレクトリに移動します。Gnuparallel を使用して、私の 4 コア マシンでこのスクリプトを簡単に並列化できます。bash スクリプト ( myScript.sh
) は次のとおりです。
ここで、クラスターで同じスクリプトを並列化したいと考えています。すべてのワーカー ノードがマスター ノードのホーム ディレクトリをマウントしているので、ls /home/zahaib/
すべてのワーカー ノードの出力を確認できます。
を使って--env
エクスポートしてみましたpar_func
。また、ファイル内にワーカー ノードのリストもありworkerList.txt
ます。parallel
私の最初のアイデアは、上記のスクリプトの最後の行を次のように変更して呼び出すことでした。
ただし、これは機能していないようで、マスター ノードのシェルは実行後にハングします./myScript.sh
。ここで何が欠けていますか?
私のfolderList.txtの内容は次のとおりです。
私のworkerList.txtの内容は次のとおりです。