我有一个python脚本,必须每3分钟运行一次。脚本运行一个进程可以运行超过10分钟。因此我需要确保如果它已经运行它不应该运行。我需要这样做,没有任何数据库干扰。 我使用它的方法是通过crontab中的以下命令获得一个cron。
*/3 * * * * sudo ps aux|grep -v grep|grep "python XMLProcessor.py"
|| cd /home/ubuntu/git/perpule-python-subscriber; sudo python XMLProcessor.py
运行顺利。但问题是,偶尔,即使在进程结束后,命令 sudo ps aux | grep -v grep | grep“python XMLProcessor.py”仍会提供输出,因为python脚本不运行。
请建议我采用更好的方法或纠正我正在使用的方法。所有建议都表示赞赏。
答案 0 :(得分:1)
您正在使用的方法存在一些问题,因为ps可以报告"意想不到的事情"。你确定你的python程序有一个唯一的名字吗?是否存在竞争条件(它可以运行程序两次)?
执行此操作的典型方法是在流程开始时触摸文件并将其删除并结束:
if [ ! -f .working ]; then
touch .working && \
python do_something.py && \
rm .working
fi
然后您可以通过检查该文件来检查它是否正常工作。但是,这种方法存在多个问题:如果进程崩溃会发生什么?你应该删除被触摸的文件吗?是否有可能在每次可能的撞车事故中将其移除?然后你需要添加超时,它开始变得复杂。
然后,正确和安全的解决方案是使用某种服务器或工具来检查您的作业是否正在运行,如果没有,则运行它。我已经使用luigi做了类似的事情,它与python代码很好地集成,所以你可以尝试一下。