我正在学习 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
$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
不包含空字节。如果是的话他们不会到达数组首先。