GNUパラレルバッシュ

GNUパラレルバッシュ

私はGNUの並列性について学んでいますが、これが意味があるかどうか疑問に思います。

大きな打撃:

    IFS=" "
while read field || [ -n "$field" ]; do
    targets_array+=("$field")
    
done </location/targets
 
parallel  -Dall bash myScript.sh ::: $targets_array

私の出力がある時点で停止しているようですので、これが意味があるかどうか疑問に思います... myScript.shを使用して30,000のターゲットをスキャンし、myScript.shを使用してデータベース内のそのターゲットに関する情報を更新しました。

いくつかのオプションを試しましたが、うまく機能しませんでした。パフォーマンスの観点からログファイルに書き込むのと同じように、一度に1つのターゲットを実行するのは妥当ですか?

ベストアンサー1

$targets_array${targets_array[0]}必要なすべての要素を取得するには${targets_array[@]}。あなたはする必要があります正しい引用

したがって、次のようになります。

parallel … ::: "${targets_array[@]}"               # but don't

parallel外部コマンドです。配列が十分に大きい場合argument list too long。代わりにこれを使用してください:

printf '%s\n' "${targets_array[@]}" | parallel …   # still not the best

Bashに組み込まれているので、よりうまく機能するため、printf以前のすべての操作は|Bashで内部的に処理されます。

私はあなたが使用していないことを知っていましたread -r(私はこれが賢明な決定だと思います)したがって、バックスラッシュと改行のペア(存在する場合)は/location/targets実際にはいくつかの配列要素で改行を生成できます。したがって、改行で区切られたデータを渡すのはparallel間違いかもしれません。ヌルバイトで区切られた:

printf '%s\0' "${targets_array[@]}" | parallel -0 …

/location/targetsnullバイトが含まれていないことを願っています。もしそうならアレイに到達しません。最初。

おすすめ記事