限制 cron 的使用

限制 cron 的使用

我在 hostgator 上有一个托管服务,我刚刚发现他们不允许 * * * * * cron 作业。如果我有一个运行频率少于每 15 分钟的作业,他们会将其更改为 */17 或类似的值。我搜索过,但找不到在自己安装的 cPanel 上执行此操作的方法。有没有关于如何复制此操作的提示。

注意:我不是在寻找绕过此限制的答案。我正在尝试找出如何在自己的部署中实现它。

谢谢。

答案1

我不知道有哪个标准包实现了这个功能。

当然,您可以创建一个 root cron 作业来检查和“修复”用户 cron 作业。以下面的脚本为例 - 它大部分未经测试,但它与我给出的几个示例配合使用。

#!/bin/bash
min=16 # the minimum allowed interval between runs
for crontab in /var/spool/cron/crontabs/*
do
  cp $crontab $crontab.bak
  # replace the * * * * * jobs with */16 * * * * jobs.
  sed -i "s/\* \* \* \* \*/\*\/16 * * * */" $crontab
  for i in `seq 1 $min`
  do  
    # replace */N * * * * for every N <= min
    sed -i "s/\*\/$i \* \* \* \*/*\/16 * * * */" $crontab
  done
done

这假设 crontab 字段由空格分隔,但这可能不是真的 - 我使用这个假设来保持正则表达式(希望)易于理解。为了使其更强大,请将左侧正则表达式中的所有空格替换为\s,如果您的 sed 支持它,或者[ \t]+(我认为)如果它不支持。

请注意,该示例对每个 crontab 都应用了 17 种不同的搜索和替换,当 crontab 数量增加时,这当然可能是不可接受的。为了缓解此问题,您可以使用单个正则表达式来匹配所有可能侵权的 cronjob。例如类似 (未经测试):\*(/[0-9][0-5])* \* \* \* \*或使用 的输出程序构建的正则表达式seq -s '|' 0 $min。如果您需要帮助,请告诉我。

相关内容