linux - 并行执行命令的动态数量

标签 linux bash

我有一个包含主机名的数组,我想用所有主机名并行执行另一个脚本。起初我用 for 循环迭代它。但是我希望它是并行的,并且我使用了等待命令,但是我不能拥有动态数量的主机。

./sub.sh ${arr[0]} &
./sub.sh ${arr[1]} &
./sub.sh ${arr[2]}
wait

现在我需要一个可以执行数组所有元素的函数。你有什么解决办法吗?

最佳答案

像这样使用 GNU Parallel:

# Generate test data
arr=($(seq 10))

# Check it looks good
echo "${arr[@]}"
1 2 3 4 5 6 7 8 9 10

# Process all elements of the array - just using "echo"
parallel -k echo {} ::: "${arr[@]}"
1
2
3
4
5
6
7
8
9
10

其他有用的选项,用于parallel 参数:

  • -j N 一次运行 N 个作业
  • --progress 会显示一个进度条
  • -k 将保持输出顺序
  • --tag 将标记输出(根据您的主机)

如果以上内容不清楚如何适用于您的具体示例,我建议您这样做:

parallel --tag -k ./sub.sh {} ::: "${arr[@]}"

关于linux - 并行执行命令的动态数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48822871/

相关文章:

linux - 根据另一个文件内容的精确匹配重命名部分文件名

bash - Docker的Bash文件无效引用$ PWD

linux - 从文件中删除字段保持定界符不变

linux - 在 Linux 上合并两个文件,只保留两个文件中出现的行

linux - 优先级为 99 的 SCHED_FIFO 进程被抢占?

javascript - 检查进程 A 写入的文件是否准备好被进程 B 读取

bash - Unix Bash Shell 脚本文件大小

regex - 从专有名称解析通用名称的正则表达式

bash - 如何在 bash 中将列表转置为表

linux - 如何获取包含特定分区的磁盘名称