【问题标题】:Does a Cron job overwrite itselfCron 作业是否会覆盖自身
【发布时间】:2015-07-08 05:32:01
【问题描述】:

我似乎无法让我的脚本在 Ubuntu 14 上通过 cron 每分钟并行运行。

我创建了一个每分钟执行一次的 cron 作业。 cron 作业执行一个运行时间超过一分钟的脚本。当一分钟到期时,似乎新的 cron 执行会覆盖之前的执行。这个对吗?欢迎任何想法。

我需要并发独立运行的作业。 cron 作业运行一个查询 mysql 数据库的脚本。这个想法是轮询一个 db- 如果是,则在它自己的进程中执行脚本。

【问题讨论】:

  • 人们必须要问为什么你要每分钟运行一个需要超过一分钟才能完成的工作。
  • 您是否希望连续执行重叠?从你的问题中不清楚。 “我可以看起来……”应该是“我不能看起来……”吗?
  • 如果您想要多个并发实例,但一次只能运行一个实例,则需要为这种情况显示一个复制器——因为默认输出Vixie cron 的开箱即用行为是运行新实例,即使旧实例仍然处于活动状态,所发生的事情必须特定于您的配置和/或您正在运行的脚本(除非您使用的是非cron 的 Vixie 实现)。

标签: linux bash unix ubuntu


【解决方案1】:

cron 不会停止先前执行的进程来启动新进程。即使旧进程仍在运行,cron 也会简单地启动新进程。

如果您需要 cron 来终止前一个进程,则需要修改脚本以自行处理。

【讨论】:

    【解决方案2】:

    您需要一种锁定机制来识别脚本已经在运行。

    有几种方法可以做到这一点,但您需要小心使用原子方法。

    我使用锁定目录,因为创建目录保证是原子的 -

    LOCKDIR=/tmp/myproc.lock
    
    if ! mkdir $LOCKDIR >/dev/null 2>&1
    then
      print -u2 "Processing already running - terminating"
      exit 1
    fi
    
    trap "rm -rf $LOCKDIR" EXIT
    

    【讨论】:

    • 如果您可以选择,我建议您使用lockfile。如果在锁定目录存在时主机崩溃,则在手动删除该目录之前不会运行该作业的未来实例。
    • 如果需要关心可移植性,lockfile 是一个很好的工具,但如果只针对现代 Linux,我倾向于建议使用 flock
    • 如果我加入一个锁定机制,它会停止下一个 cron 执行吗?我希望第一个继续,第二个并行启动。
    • @Sascha,这就是 Vixie cron 开箱即用的做法,所以如果这是你想要的行为,你根本不需要改变任何东西。 (其他一些实现,例如 fcron,让您可以在 crontab 中明确控制该行为)。
    • @Sascha,...这就是为什么这里的所有答案都假设您一次只需要一个 - 您要求的行为是默认情况下已经存在的行为!
    【解决方案3】:

    这是一种常见的情况。尝试在脚本中添加检查以查看锁定文件是否已存在。如果是,请退出。如果没有,请继续。

    Cronjobs 不会溢出。然而,它们确实有重叠的可能性。除非您的脚本明确杀死任何预先存在的进程,否则它不应该能够停止以前运行的脚本。

    但是,引入锁文件的概念将使您完全摆脱所有这些困惑。

    【讨论】:

    • OP 询问如何使他们的 cron 作业运行多个并发实例,而不是如何确保只运行一个。 (这个问题并不清楚,但他们已经在 cmets 的另一个答案中明确表示)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2020-04-19
    • 2023-04-03
    相关资源
    最近更新 更多