我有一个 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
作业:
file_splitter.sh
-> 拆分文件并将它们存储在特定目录中file_processer.sh
-> 从上面的目录中一次获取一个文件,进行读取循环,然后调用data.sh
。成功处理后删除文件。
安排 file_splitter.sh
在 file_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 作业的帖子。你可能想看看它:
关于linux - 将负载分配给多个 cron 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42018226/