【问题标题】:How to automate my three bash scripts over several folders with files?如何在多个包含文件的文件夹中自动化我的三个 bash 脚本?
【发布时间】:2015-09-26 18:18:21
【问题描述】:

我有大量文件,每个文件都将被解码、排序/最小化,然后放入数据库中。这些操作中的每一个都有自己的 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

等.. 直到 12 月。

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

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

数据量: 1.3 TB

数据类型:文本文件

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

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

【问题讨论】:

  • 这是业余爱好,还是专业工作?换句话说,你有多认真?如果是为了工作,那就麻烦了!
  • 有点严重,但我在硬件/金钱和时间上都有限制,所以我不得不遗憾地用我的笔记本电脑和外接高清。
  • 彻底搞砸你会付出怎样的代价?想象一下丢失笔记本电脑和磁盘?你自己的时间呢?
  • 编辑您的问题以改进它,并说明动机和所有这些事情的意义(例如数据的种类和数量)。如果这有点严重,您的笔记本电脑+外部磁盘+sqlite方法是一个巨大的错误,您肯定会丢失所有数据(和一些硬件)。外部磁盘(和笔记本电脑)并非设计为 24 小时/24 小时运行
  • 即使你是一个挨饿的学生,为你的论文做这件事,你也应该投入一些钱(和很多你的努力)。

标签: python linux bash shell ubuntu


【解决方案1】:

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

你也可以看看GNU parallel,但我猜你不需要它。

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

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

顺便说一句;请务必测试每个脚本(甚至其中的部分)是否成功。使用logger(1) 发出日志消息(可能在持续超过半小时的每个步骤或命令之后,以及每个脚本的开始和结束时)。每天检查日志!

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

在某些外部 USB 硬盘上这样做是恕我直言的错误,因为此类硬件的可靠性有限(而且通常很慢)。您应该考虑拥有一些服务器(也许一个好的桌面可能具有这样的作用)。您可能需要UPS 以避免电源故障。

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

【讨论】:

  • 谢谢!我有一个 SQLite 数据库,但是当我写入一个表时,我相信数据库会被锁定,并且无法同时输入多个文件?
  • 你应该使用真正的 DBMS(不是 sqlite)。他们能够管理对单个表的并发写入......(前提是为此精心设计了数据库模式和索引)。您的整体设置看起来很脆弱。如果此类处理对您很重要,请升级您的硬件和软件。估计失败的成本。
  • 感谢您的回答。我真的知道你从哪里来,你在说什么,但遗憾的是我的预算超出了我的控制范围,所以我担心我至少无法升级我的硬件。
  • 云的东西——或者只是租一个真正的VPS,每月花费几十美元或欧元。
【解决方案2】:

您可以有两个脚本,一个有一个 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

【讨论】:

    【解决方案3】:

    使用 GNU Parallel 它看起来像这样:

    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 循环。

    如果您想在 4 个 CPU 上运行 32 个不同的作业,那么并行化的直接方法是在每个 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
    

    有关其他安装选项,请参阅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

    【讨论】:

      猜你喜欢
      • 2020-01-07
      • 2015-04-19
      • 1970-01-01
      • 2022-10-15
      • 2017-03-08
      • 1970-01-01
      • 2013-07-06
      • 2020-11-05
      • 2014-11-16
      相关资源
      最近更新 更多