【问题标题】:Distributing payload to multiple cron jobs将有效负载分配给多个 cron 作业
【发布时间】:2017-06-20 11:16:00
【问题描述】:

我有一个 shell 脚本说data.sh。为了执行这个脚本,我将传递一个参数,比如 Table_1。

我有一个测试文件,我将得到一个不同脚本的结果。

现在在一个测试文件中,我有 1000 多个参数要传递给脚本。

文件如下所示:

Table_1
Table_2
Table_3
Table_4
and..so..on

现在我想执行脚本以并行运行。

我正在使用 cron 作业来执行此操作。

首先我使用 Linux 中的 split 命令将测试文件分成 20 个部分。

 split -l $(($(wc -l < test )/20 + 1)) test

然后我将测试文件分为 20 个部分,例如 xaa、xab、xac 等。

然后运行 ​​cron 作业:

* * * * * while IFS=',' read a;do /home/XXXX/data.sh $a;done < /home/xxxx/xaa
* * * * * while IFS=',' read a;do /home/XXXX/data.sh $a;done < /home/xxxx/xab
and so on.

因为这涉及很多手动过程。我想动态地做到这一点。

这是我想要实现的目标:

1) 一旦我得到测试文件,我希望它自动拆分为 20 个文件并存储在特定位置。

2) 然后我想通过将 20 个文件作为参数传递给脚本来安排每天早上 5 点的 cron 作业。

实现这一点的最佳方法是什么?任何带有解释的答案将不胜感激。

【问题讨论】:

    标签: linux shell cron


    【解决方案1】:

    这是你可以做的。创建两个cron 工作:

    1. file_splitter.sh -> 拆分文件并将它们存储在特定目录中
    2. file_processer.sh -> 从上面的目录中一次选择一个文件,执行读取循环,然后调用data.sh。成功处理后删除文件。

    安排 file_splitter.shfile_processor.sh 之前运行。

    如果你想实现进一步的并行性,你可以让file_splitter.sh将分割的文件写入多个目录,每个目录中都有几个文件。假设它们被称为 sub1、sub2 等。然后,您可以调度 file_processor.sh 的多个实例并将子目录名称作为参数传递。由于拆分文件存储在不同的目录中,我们可以确保只有一个作业处理特定子目录中的文件。

    最好让cron 命令尽可能简单。

    * * * * * /path/to/file_processor.sh
    

    优于

    * * * * * while IFS=',' read a;do /home/XXXX/data.sh $a;done < /home/xxxx/xab
    

    有道理吗?

    我写了一篇关于如何有效管理 cron 作业的帖子。你可能想看看它:

    Managing log files created by cron jobs

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 1970-01-01
      • 2012-04-23
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      相关资源
      最近更新 更多