我在Ubuntu上运行了大量的cron作业(使用sudo crontab -e ),最近(尽pipe我不知道何时可以确定),我突然看到相同的作业似乎在多次运行同一分钟。 你不需要看完整的crontab就可以相信我,他们绝对不会被列出两次。 但是,这里有一个片段:
*/2 * * * * /usr/bin/wget --no-check-certificate 'https://myserver.net/someuri/pdm/33?embed_in_page=xyz' * * * * * /usr/bin/wget --no-check-certificate 'https://myserver.net/someuri/pdm/77' * * * * * /usr/bin/wget --no-check-certificate 'https://myserver.net/someuri/pdm/20?blah=blah' * * * * * echo "`date` Running now" >> /home/somewhere/croncheck
我还添加了这个简单的回声,以便每分钟运行一次,而且永远不会运行多次。
所以,对于回声,我只能每分钟看一次。 但间歇地,尤其是在负载下,服务器似乎连续多次激发wget URL请求(我知道通过查看web服务器日志,他们大致同时来自同一地点)。
如果我运行ps -A |grep cron
我会看到十几个或更多的条目,看起来像:
28055 ? 00:00:00 cron
他们似乎并没有消失。
如果我运行ps aux那么我只能看到一个条目,如我所料。
所以,我的猜测是,wget和cron之间存在一个讨厌的交互,也许某种方式在某种程度上是失败的(即使服务器和通过networking浏览器对同一个web服务器的交互调用看起来基本上没有受到影响,只是被不必要的工作)。 但现实是我不知道。 我正在寻找你可能有的任何想法,以及可能的解决scheme。
虽然我不完全确定为什么会发生这种情况,但是在cron里面长时间运行的工作似乎是一个奇怪的行为。 在原来的岗位上,有一系列的工作是每五分钟一次,一分钟一次。 如果第一份工作耗时过长(例如10分钟),我的猜测是第一份工作的分叉过程将持续十分钟,并在列表中激发后续工作。 但是主要的cron过程也正确地解决了这些工作,所以出现了重复,整个问题层出不穷。
足够的猜测。 为了解决这个问题,下面是我的新crontab的一个片段,使用flock来阻止可能级联错误的后续作业。
# every 5 minutes */5 * * * * flock -w 2000 /tmp/cnsd.lockfile.pdm -c "/usr/bin/longrunningjob1" # every 5 minutes */5 * * * * flock -w 2000 /tmp/cnsd.lockfile.pdm -c "/usr/bin/longrunningjob2" # every 15 minutes past the hour 15 * * * * flock -w 2000 /tmp/cnsd.lockfile.pdm -c "/usr/bin/longrunningjob3"
至less在这种情况下,当系统超负荷运行时,不会导致一连串不应该被激发的工作,而是给予一切恢复的机会。 我使用不同的群集锁文件玩过不同类别的作业,但在我的情况下,我只有有限的资源,所以排队一个接一个是保持系统运行的最佳方式。
validationnetworking日志多次显示完全相同的条目。 如果是的话,确认他们是在同一时间。 克朗并不是绝对的,正如有人说这个系统是征税的。 Cron会在所述的时间“尝试”运行这些工作,但这不是绝对的,有时候工作会比预期的要晚,也可能在同一个工作时间,然后你会看到两个条目。
另一个问题可能是工作需要比预期更长的时间,并且在下一次迭代开始时仍然在运行。 我会开始消除。 注释掉所有的,然后让它运行和监视,然后添加下一个,然后下一个等,看看会发生什么。