私は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/targets
nullバイトが含まれていないことを願っています。もしそうならアレイに到達しません。最初。