我试图运行一个cron作业来执行我的shell脚本,我的shell脚本有hive和pig脚本。我将cron作业设置为每2分钟执行一次,但在shell脚本完成之前,cron作业将再次启动,它是否会影响我的结果,或者脚本完成执行后,只有它才会启动。我在这里进退两难。请帮忙。谢谢
2ledvvac1#
我认为有两种方法可以更好地解决这个问题,一种是长的方法,一种是短的方法:很长的路(可能最正确):使用类似luigi的工具来管理作业依赖关系,然后用cron运行它(它不会运行同一个作业中的多个)。luigi将为您处理所有作业依赖关系,您可以确保特定作业只执行一次。准备起来要多花点功夫,但真的很值得。捷径:锁定文件已经提到过了,但是您也可以在hdfs上这样做,这样就不依赖于从何处运行cron作业。在开始和完成作业时,不要检查锁文件,而是在hdfs上设置一个标志,并将此作为所有cron作业的标准:
hadoop fs-touchz/jobs/job1/2016-07-01/\u已启动
hadoop fs-touchz/jobs/job1/2016-07-01/\u已完成
如果(!开始&&!已完成):运行作业;添加完成;删除\u已开始
tzxcd3kk2#
在脚本开始时,请检查:
# !/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
有许多其他方法可以达到同样的效果。我举一个简单的例子。
2条答案
按热度按时间2ledvvac1#
我认为有两种方法可以更好地解决这个问题,一种是长的方法,一种是短的方法:
很长的路(可能最正确):
使用类似luigi的工具来管理作业依赖关系,然后用cron运行它(它不会运行同一个作业中的多个)。
luigi将为您处理所有作业依赖关系,您可以确保特定作业只执行一次。准备起来要多花点功夫,但真的很值得。
捷径:
锁定文件已经提到过了,但是您也可以在hdfs上这样做,这样就不依赖于从何处运行cron作业。
在开始和完成作业时,不要检查锁文件,而是在hdfs上设置一个标志,并将此作为所有cron作业的标准:
开始时
hadoop fs-touchz/jobs/job1/2016-07-01/\u已启动
完成时
hadoop fs-touchz/jobs/job1/2016-07-01/\u已完成
然后检查它们(伪代码):
如果(!开始&&!已完成):运行作业;添加完成;删除\u已开始
tzxcd3kk2#
在脚本开始时,请检查:
有许多其他方法可以达到同样的效果。我举一个简单的例子。