我在 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
。如果您需要帮助,请告诉我。