【问题标题】:Running a python script on a linux machine after every few minutes, only if its not already running每隔几分钟在 linux 机器上运行一个 python 脚本,前提是它还没有运行
【发布时间】:2018-09-22 15:36:52
【问题描述】:

我有一个必须每 3 分钟运行一次的 python 脚本。脚本运行一个进程虽然可以运行超过 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 脚本不运行。

请建议我一种更好的方法或纠正我正在使用的方法。感谢所有建议。

【问题讨论】:

    标签: python linux ubuntu cron


    【解决方案1】:

    您使用的方法存在一些问题,因为 ps 可以报告“意外情况”。你确定你的python程序有一个唯一的名字吗?会不会有竞态条件(可以运行两次)?

    执行此操作的典型方法是在进程开始时触摸文件,然后将其删除并结束:

    if [ ! -f .working ]; then touch .working && \ python do_something.py && \ rm .working fi

    然后您可以通过检查该文件来检查它是否正常工作。但是,这种方法存在多个问题:如果进程崩溃会发生什么?你应该删除触摸的文件吗?是否可以在每次可能的崩溃时将其删除?然后你需要添加超时,它开始变得复杂。

    然后,正确且更安全的解决方案是使用某种服务器或工具来检查您的作业是否正在运行,如果没有,则运行它。我用luigi 做了类似的事情,它与python代码集成得很好,所以你可以试一试。

    【讨论】:

    • Luigi 看起来很有趣。我能知道你用它做什么吗?该任务与我的任务有何相似之处?
    • 我已经将它用于使用 python 代码的数据库/文件系统备份。如果它还没有运行,那么每天都会启动一个备份过程(luigi 检查)。如果当天生成了大量数据,则备份可能需要一整天以上的时间。我认为是相似的,因为无论是每天还是每分钟运行都无关紧要,luigi 将确保只有一个作业实例正在运行。
    • 刚看到这个。我今天通过了 luigi,但我无法弄清楚如何确保在运行第一个任务时是否不满足条件,第二个(依赖)任务不会被触发。有什么想法吗?
    • 你需要另一个人的任务。 task1 需要某些东西(例如要存在的文件),而 tas2 需要 task1。看看triggering-recurring-tasks
    猜你喜欢
    • 2018-09-24
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2017-05-08
    • 2022-06-28
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多