linux - 将负载分配给多个 cron 作业

标签 linux shell cron

我有一个 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 作业。

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

最佳答案

这是您可以执行的操作。创建两个 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

关于linux - 将负载分配给多个 cron 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42018226/

相关文章:

linux - 如何在 Intel Galileo 上重置运行代码

mysql - 为什么我不能在存储过程中使用 mysqldump 命令?

cron 作业无法在 Google Compute Engine 上的 R 脚本上运行

Java进程命令结果无法捕获结果

bash - sed 无法匹配 0 次或 1 次

java - 如何使用 Spring 框架实现 Java cron 作业,我正在寻找 Spring Batch 吗?

linux - Vim 在启动时发送 Alt-F10 键

linux - UNIX 从变量中删除字符

linux - 用户地址内存是如何组织的?

security - 仅用于代理(ssh-D)访问的登录shell?