加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何向GNU Parallel提供大量命令?

发布时间:2020-12-16 01:14:59 所属栏目:安全 来源:网络整理
导读:我正在评估 GNU Parallel是否可用于并行搜索存储在系统上的文件.系统中每年的每一天(doy)只能有一个文件(因此每年最多366个文件).假设系统上有3660个文件(大约10年的数据).该系统可以是多CPU多核Linux或多CPU Solaris. 我正在存储搜索命令以在数组中的文件上
我正在评估 GNU Parallel是否可用于并行搜索存储在系统上的文件.系统中每年的每一天(doy)只能有一个文件(因此每年最多366个文件).假设系统上有3660个文件(大约10年的数据).该系统可以是多CPU多核Linux或多CPU Solaris.

我正在存储搜索命令以在数组中的文件上运行(每个文件一个命令).这就是我现在正在做的事情(使用bash)但是我无法控制并行启动的搜索次数(绝对不想一次启动所有3660次搜索):

#!/usr/bin/env bash
declare -a cmds
declare -i cmd_ctr=0

while [[ <condition> ]]; do
    if [[ -s $cur_archive_path/log.${doy_ctr} ]]; then
      cmds[$cmd_ctr]="<cmd_to_run>"
      let cmd_ctr++
    fi
done

declare -i arr_len=${#cmds[@]}
for (( i=0; i<${arr_len}; i++ ));
do
  # Get the command and run it in background
  eval ${cmds[$i]} &
done
wait

如果我使用parallel(它将自动计算最大CPU /核心并且仅并行开始这么多搜索),我如何重复使用并行的数组cmds并重写上述代码?另一种方法是将所有命令写入文件,然后执行cat cmd_file |平行

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Using-shell-variables说:
parallel echo ::: "${V[@]}"

你不想要回声,所以:

parallel ::: "${cmds[@]}"

如果你不需要其他任何内容的$cmds,那么使用’sem'(这是并行的别名–semaphore)https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Working-as-mutex-and-counting-semaphore

while [[ <condition> ]]; do
  if [[ -s $cur_archive_path/log.${doy_ctr} ]]; then
    sem -j+0 <cmd_to_run>
  fi
done
sem --wait

你还没有描述什么< condition>可能.如果你只是做一个类似for循环的东西,你可以用以下代码替换整个脚本:

parallel 'if [ -s {} ] ; then cmd_to_run {}; fi' ::: $cur_archive_path/log.{1..3660}

(基于https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Composed-commands).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读