Python 如何在多个包含文件的文件夹中自动执行我的三个bash脚本?

Python 如何在多个包含文件的文件夹中自动执行我的三个bash脚本?,python,linux,bash,shell,ubuntu,Python,Linux,Bash,Shell,Ubuntu,我有大量的文件,每个文件都将被解码、排序/最小化,然后放入数据库。每个操作都有自己的bash脚本。这些文件被分类为每日文件,这些文件位于其连续的每月文件夹中。问题是只有一个数据库,只有一个表(SQLite),因此数据库脚本一次只能在一个文件上运行,而解码和排序可以同时在大约四个文件上完成 对于要排序的文件,必须经过解码过程,对于要放入数据库的文件,必须对其进行解码和排序。这些脚本的运行时间不一样,我相信解码是禁食,然后是输入,然后是排序 每个bash脚本decode.shsort.shsavei

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

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

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

最初我想有一个主脚本,它执行
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
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 ...   
等等。。直到12月

然而,我不知道我是如何以一种好的方式设置它的。我知道我可以并行地运行
2:
中的脚本,但是我不太确定在2:完成时如何自动运行脚本3:

我也不确定这是否是最好的方法。理想情况下,始终运行解码脚本、排序脚本和saveintodb脚本。甚至可能有几个解码和排序脚本(不知道这是否会加快进程,我正在使用外部HD)

数据量:1.3 TB

数据类型:文本文件

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

很抱歉,这里有这么长的文字,您有什么建议吗?

在Linux上,请使用来计划各种shell脚本。它们可以并行运行

你也可以调查一下,但我想你不需要

最后,shell脚本可以使用or
batch
调度另一个脚本。例如,
decode.sh
可能以
batch-f sort.sh
at-f sort.sh结束,此时+10分钟

您可以使用一些更强大的脚本语言,例如Python、Guile、Perl等等

顺便说一句;,确保测试每个脚本(甚至其中的部分)的成功。用于发出日志消息(可能在持续半小时以上的每个步骤或命令之后,以及在每个脚本的开始和结束时)。每天检查日志

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

在一些外部USB硬盘上这样做是错误的,因为这样的硬件可靠性有限(而且通常速度很慢)。你应该考虑拥有一些服务器(也许一个好的桌面可能会有这样的作用)。您可能需要一个电源开关来避免电源故障


如果这种复杂的处理和处理后的数据对您有一定价值,您应该升级硬件(获得一台服务器机器,可能带有UPS,如果数据合适,还有一台),以及软件(使用真正的DBMS,注意故障)。估计故障和/或数据丢失的成本(记住要考虑您的时间)。也许租用一些云计算或存储设备会很有趣(或者只是一个带备份的托管Linux系统,你可以每月花几十美元或欧元买一个:,,,,,,,,,,,,,,,,,,,,,

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

脚本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 Parallel时,它看起来如下所示:

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
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 Parallel是一个通用的并行程序,它使得在同一台机器上或在您有ssh访问权的多台机器上并行运行作业变得非常容易。它通常可以代替
for
循环

如果您有32个不同的作业要在4个CPU上运行,并行化的直接方法是在每个CPU上运行8个作业:

GNU Parallel会在完成时生成一个新进程—使CPU保持活动状态,从而节省时间:

安装

如果您的发行版没有打包GNU Parallel,那么您可以进行个人安装,而不需要root访问。通过执行以下操作,可在10秒内完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
有关其他安装选项,请参阅

了解更多信息

请参阅更多示例:

观看介绍视频:

浏览本教程:


注册电子邮件列表以获得支持:

谢谢!我有一个SQLite数据库,但当我在一个表中写入时,我相信数据库被锁定了,不可能同时输入多个文件?您应该使用真正的DBMS(而不是SQLite)。他们能够管理对单个表的并发写入。。。(前提是数据库模式和索引是为此精心设计的)。您的整体设置看起来很脆弱。如果这样的处理对您很重要,请升级您的硬件和软件。估计失败的代价。谢谢你的回答。我真的知道你从哪里来,知道你在说什么,但很遗憾,我的预算超出了我的控制范围,所以我恐怕不能