我正在尝试运行一个执行我的shell脚本的cron作业,我的shell脚本正在使用hive&猪脚本。我将cron作业设置为每2分钟执行一次,但在我的shell脚本完成之前,我的cron作业再次启动是否会影响我的结果,或者一旦脚本完成执行,那么只有它才会启动。我在这里陷入了两难境地。请帮忙。 感谢
答案 0 :(得分:2)
我认为有两种方法可以更好地解决这个问题,包括很长的路要走:
很长的路(可能是最正确的):
使用Luigi之类的东西来管理作业依赖关系,然后用Cron运行它(它不会运行多个同一个作业)。
Luigi将为您处理所有工作依赖关系,您可以确保特定工作只执行一次。这需要更多的工作来设置,但它确实值得。
短道:
锁定文件已被提及,但您也可以在HDFS上执行此操作,这样做并不依赖于您从哪里运行cron作业。
不是检查锁文件,而是在启动和完成作业时在HDFS上放置一个标志,并将其作为所有cron作业中的标准内容:
#start at
hadoop fs -touchz / jobs / job1 / 2016-07-01 / _STARTED
#the finish
hadoop fs -touchz / jobs / job1 / 2016-07-01 / _COMPLETED
#然后检查它们(伪代码):
if(!started&&!completed):run_job; add_completed; remove_started
答案 1 :(得分:1)
在脚本开头,请检查:
#!/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
还有很多其他方法可以实现同样的目标。我举一个简单的例子。