如何使用文件在几个文件夹中自动化我的三个bash脚本?

我有大量的文件,每个文件将被解码,sorting/最小化,然后放入一个数据库。 每个操作都有自己的bash脚本。 这些文件被分类到每日文件中,这些文件在其连续的每月文件夹中。 问题是只有一个数据库和一个表(SQLite),因此数据库脚本只能在一个文件上运行,而解码和sorting可以同时在大约四个文件中完成。

对于要sorting的文件,必须经过解码过程,才能将文件放入数据库,必须进行解码和sorting。 这些脚本的运行时间是不一样的,我相信解码是禁食,然后来input然后来sorting。

每个bash脚本decode.sh sort.sh saveintodb.sh循环遍历文件夹中的所有文件并执行其工作。

本来我想有一个masterscript执行decode.sh – > sort.sh – > saveintodb.sh为每个文件夹(月)。

但是,由于预计需要几天,我想到了这样的事情:

 1: decode.sh January 2: sort.sh January, decode.sh February 3: saveintodb.sh January sort.sh February decode.sh March 4: saveintodb.sh February sort.sh March decode.sh April 

等到十二月。

但是,我不知道我是如何设置的,这是一个很好的方法。 我知道我可以在2:运行脚本,但是我不太确定如何运行脚本3:2:时自动完成。

我也不确定这是否是最好的办法。 理想情况下,一直运行解码脚本,sorting脚本和saveintodb脚本。 也许甚至有几个解码和sorting脚本(不知道如果这会加快这个过程,我正在外面的HD悲伤)。

数据量: 1.3 TB

数据types:文本文件

背景:位置报告(纬度/经度,时间)

对不起,这个长文本,有什么build议吗?

在Linux上,使用crontab(5)安排各种shell脚本。 他们可以并行运行。

你也可以看看GNU平行 ,但我想你不需要它。

最后,shell脚本可以使用at或batch来调度另一个脚本。 例如, decode.sh可能可能以batch -f sort.sh结尾,或者at -f sort.sh now + 10 minutes

你可能会使用一些更强大的脚本语言,例如Python,Guile,Perl,….

顺便说一下,一定要测试每个脚本的成功(甚至是其中的部分)。 使用记录器(1)发送日志消息(也许在每个步骤或命令持续半小时以上,在每个脚本的开始和结束之后)。 每天检查日志!

最后,我不明白为什么一次只能运行一个数据库脚本。 大多数真正的DBMS(PostGreSQL,MonGoDB,MariaDB等) – 但不是sqlite – 可以运行(或被配置为运行)同时访问同一数据库(或者当然不同的数据库)的数据库客户端。 阅读有关ACID属性的更多信息。

这样做在一些外部的USB硬盘是恕我直言,是一个错误,因为这样的硬件有限的可靠性(通常很慢)。 你应该考虑有一些服务器(也许一个好桌面可能有这样的角色)。 你可能需要一个UPS来避免电源故障。

如果这种复杂的处理和处理后的数据对您有一定的价值,您应该升级硬件(可能需要一台服务器,可能带有UPS和ECC RAM ,如果数据合适的话,还可以使用SSD )和软件(使用真正的DBMS ,关心失败)。 估算失败和/或数据丢失的成本(记住考虑你的时间)。 也许租用一些云计算或存储可能是有趣的(或者简单地说是一个带有备份的VPS托管的Linux系统,每个月你可以得到一个大约两十美元或者欧元的钱: kimsufi , ovh , rackspace , aws ,…)。 。

你可以有两个脚本,一个具有for循环,解码和排序,并创建一个文件作为另一个脚本的标志。 另一个脚本会在while循环中检查这些文件,并将它们放入数据库中。 脚本1

 function decodeAndSort{ decode.sh $1 sort.sh $1 touch ./tmpDir/$1 } for month in months do decodeAndSort $month & # the ampersand is to run in the background done 

脚本2

  array=bla #with names of files while [[ $count -lt 12 ]] do if [[ -e ./tmpDir/${array[$count]} ]] #test file exists saveintodb.sh ${array[$count]} rm ./tmpDir/${array[$count]} # clear the flag (( count++ )) else sleep 1 # adjust this as necesary fi done 

使用GNU并行它看起来像这样:

 doit() { sem --id decode decode.sh $1 sem --id sort sort.sh $1 sem --id dbsave saveintodb.sh $1 } export -f doit parallel -j4 doit {} ::: Jan Feb Mar ... 

这将确保您一次运行一个解码,排序和saveintodb。 如果你只想保护saveintodb:

 doit() { decode.sh $1 sort.sh $1 sem --id dbsave saveintodb.sh $1 } export -f doit parallel -j4 doit {} ::: Jan Feb Mar ... 

在这里,你将有4个解码/排序运行,但只有一个saveintodb。

sem是GNU Parallel的一部分。

GNU并行是一个通用的并行程序,可以很容易地在同一台机器或多台你有ssh访问的机器上并行运行作业。 它通常可以代替一个for循环。

如果你想在4个CPU上运行32个不同的作业,那么最简单的方法就是在每个CPU上运行8个作业:

简单的调度

当一个完成时,GNU并行会产生一个新的进程 – 保持CPU活动,从而节省时间:

GNU并行调度

安装

如果您的发行版没有打包GNU Parallel,则可以进行个人安装,而不需要root权限。 这可以在10秒内做到这一点:

 (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

学到更多

查看更多示例: http : //www.gnu.org/software/parallel/man.html

观看介绍视频: https : //www.youtube.com/playlist? list = PL284C9FF2488BC6D1

浏览教程: http : //www.gnu.org/software/parallel/parallel_tutorial.html

注册邮件列表以获得支持: https : //lists.gnu.org/mailman/listinfo/parallel