GNU 并行 bash

GNU 并行 bash

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

相关内容