【问题标题】:Run shell script in parallel in bash/linux在 bash/linux 中并行运行 shell 脚本
【发布时间】:2017-09-24 08:29:20
【问题描述】:

我有一个 shell 脚本job.sh

内容如下:

#!/bin/bash

table=$1

sqoop job --exec ${table}

现在当我做 ./job.sh table1

脚本执行成功。

我在文件tables.txt 中有表名。

现在我想遍历 tables.txt 文件并并行执行 job.sh 脚本 10 次。

我该怎么做?

理想情况下,当我执行脚本时,我希望它如下所示;

./job.sh table1
./job.sh table2
./job.sh table3
./job.sh table4
./job.sh table5
./job.sh table6
./job.sh table7
./job.sh table8
./job.sh table9
./job.sh table10

有哪些可用选项?

【问题讨论】:

    标签: linux bash shell cron crontab


    【解决方案1】:

    你可以这样做

    < tables.txt xargs -I% -n1 -P10 echo sqoop job --exec %
    

    -P10 将并行运行 10 个进程。而且您甚至不需要帮助脚本。

    正如@CharlesDuffy 评论的那样,您不需要-I,例如更简单:

    < tables.txt xargs -n1 -P10 echo sqoop job --exec
    

    【讨论】:

    • @CharlesDuffy 真的!在这种情况下不需要-I。在printf "%s\n" {1..20} | xargs -I% -n1 -P10 echo sqoop job --exec table%这样的情况下可能会有所帮助
    • 当然,虽然也可以在那里使用table{1..20},并避免-I 带来的毛茸茸。诚然,255 字节的字符串限制不是立即 问题,并且倾向于以导致注入攻击的方式被滥用或 POSIX 指定的每个命令行的替换数量限制(或5) 同样,但它只是让我印象深刻的气味。
    【解决方案2】:

    只需 GNU Parallel

    parallel -a tables.txt --dry-run sqoop job --exec {}
    

    样本输出

    sqoop job --exec table7
    sqoop job --exec table8
    sqoop job --exec table9
    sqoop job --exec table6
    sqoop job --exec table5
    sqoop job --exec table4
    sqoop job --exec table3
    sqoop job --exec table2
    sqoop job --exec table1
    sqoop job --exec table10
    

    如果看起来正确,只需删除 --dry-run 并再次运行即可。

    如果您希望一次运行 4 个作业,请使用:

    parallel -j 4 ....
    

    如果您希望每个 CPU 内核执行一项工作,这是默认设置,因此您无需执行任何操作。

    如果您希望作业保持有序,请添加-k 选项:

    parallel -k ...
    

    【讨论】:

    • @CharlesDuffy 我没有看到它提到 OP 有busybox,如果运行sqoop,我期待一台相当体面的机器。
    • 你说得对——我一定是在想一个不同的问题。
    【解决方案3】:

    选项 1

    通过附加&amp; 将所有脚本作为后台进程启动,例如

    ./job.sh table1 &
    ./job.sh table2 &
    ./job.sh table3 &
    

    但是,这将同时运行所有作业!

    选项 2

    对于更多时间或内存消耗的脚本,您可以使用xargs 同时运行有限数量的任务,例如here 所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多