脚本没有完成执行,但cron作业再次开始

问题描述:

我想运行一个cron作业,它将执行我的shell脚本,我的shell脚本有配置文件&猪脚本。我将cron作业设置为每2分钟执行一次,但在我的shell脚本完成之前,我的cron作业再次启动会影响我的结果,或者一旦脚本完成其执行,那么只会启动它。我在这里有点困难。请帮忙。 感谢脚本没有完成执行,但cron作业再次开始

+0

你希望你的cron作业只有在你先前执行完同一个脚本之后才能启动? – Fazlin

+0

为执行创建一个锁定文件。根据您的要求,您可以简单地忽略执行,如果以前尚未完成(我个人喜欢这个)或只是等待锁被释放。 – satish

+0

@Fazlin是的,我想流 – Ironman

我认为有两种方式,以更好地解决这个问题,很长的路要走和一小段路:

  • 朗方式(可能是最正确的):

    使用类似Luigi管理工作的依赖性,然后用Cron运行它(它不会运行多个相同的工作)。

    Luigi会为您处理所有的工作依赖关系,您可以确保某个工作只执行一次。这需要更多的工作来完成设置,但这确实是值得的。

  • 快捷途径:

    锁文件已经提到过,但你可以做到这一点对HDFS也这样,它不依赖于您运行从cron作业。

    不是检查锁文件,把国旗HDFS当你开始和完成作业,并有本作中所有的cron作业的标准的事情:

    #在启动

    Hadoop的FS -touchz /职位/ JOB1/2016年7月1日/ _STARTED

    #在最终

    Hadoop的FS -touchz /职位/ JOB1/2016年7月1日/ _COMPLETED

    #然后检查它们(伪代码):

    if(!started & &!completed:run_job; add_completed; remove_started

+0

只抛出一个与Luigi类似的称为“气流”的选项。与Luigi或Airflow合作可能是更好和有效的方法。使用Airflow(Luigi也),您将工作(dag)标记为取决于过去的完成情况。 – satish

+0

感谢您的帮助。我会两种方式。 – Ironman

+0

@satish谢谢你的帮助。我讨论“气流”。 – Ironman

在脚本的开始,有一个检查:

#!/bin/bash 
if [ -e /tmp/file.lock ]; then 
    rm /tmp/file.lock # removes the lock and continue 
else 
    exit # No lock file exists, which means prev execution has not completed. 
fi 

.... # Your script here 

touch /tmp/file.lock 

有殊途同归的许多其他方面。我举一个简单的例子。

+0

file.lock中有什么,在shell脚本中写这个检查的地方在哪里? – Ironman

+0

file.lock是一个空文件,我使用'touch'在脚本的最后一行创建。我的例子中的'if'条件应该在实现之前首先执行。 – Fazlin

+0

我已编辑我的帖子。希望这有助于你的理解。 – Fazlin