每分钟执行的 Cron 作业都乱序?

每分钟执行的 Cron 作业都乱序?

我正在设置一些 shell 脚本,每五分钟执行一次,然后在我们客户端的系统上每分钟执行一次,以轮询日志并提取一些计时信息,以便另一个应用程序通过外部文件存储和访问。我们当前的实现工作正常,因为它将一行写入两个单独的文件。我们正在完善该流程,因此现在我需要每五分钟向一个文件写入两行,每分钟向另一个文件写入四行。然而,我在测试中注意到,每隔几分钟这些行似乎就会乱序执行。

我的脚本如下:

 */5 * * * *     ~/myscript.pl ~/mylog | tail -3 | head -1 > ~/myreport1
 */5 * * * *     ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport1

 * * * * *       ~/myscript.pl ~/mylog | tail -8 | head -1 > ~/myreport2
 * * * * *       ~/myscript.pl ~/mylog | tail -7 | head -1 >> ~/myreport2
 * * * * *       ~/myscript.pl ~/mylog | tail -3 | head -1 >> ~/myreport2
 * * * * *       ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport2

在某些情况下,似乎只有少数几行正确执行,而在其他情况下,只写入了一行。我什至没有一直看到写入文件的完整行数,否则我只是假设我提取的值没有被正确收集。我不确定如何判断所有 cron 行是否都在执行,以及什么可能导致它们不按顺序发生,或者根本不执行。

答案1

无法保证 cron 会按照任务在 cronfile 中出现的顺序运行任务。事实上,它很可能同时运行两个任务。因此,让任务相互依赖绝对不是一个好主意。例如,在您的 cronfile 中,一个任务创建一个文件,另一个(或三个)任务附加到该文件。如果appender首先启动,创建者将有效地删除appender的工作。

更好的方法是创建一个每分钟运行四次的驱动程序脚本,myscript以及每五分钟运行两次的另一个驱动程序脚本。然后,您可以对两个驱动程序脚本进行 cron 操作,从而每个时间间隔仅执行一个 cron 任务。

答案2

就 cron 而言,您有很多同时执行的命令。 Cron 只是创建一些“并行”运行的子进程 - 即它们以某种方式进行多任务/调度,这为您的用例引入了数据竞争。

对于您的问题,您实际上并不需要 cron.像这样一个简单的 shell 脚本就足够了:

#!/bin/sh
function f1() {
  ~/myscript.pl ~/mylog | tail -3 | head -1 > ~/myreport1
  ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport1
}

function f2() {
 ~/myscript.pl ~/mylog | tail -8 | head -1 > ~/myreport2
 ~/myscript.pl ~/mylog | tail -7 | head -1 >> ~/myreport2
 ~/myscript.pl ~/mylog | tail -3 | head -1 >> ~/myreport2
 ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport2
}

while true; do
  f1
  f2
  sleep 1
  f2
  sleep 1
  f2
  sleep 1
  f2
  sleep 1
  f2
  sleep 1
done

现在一切都定义好了,即执行顺序得到了保证。

at您可以通过- 或从会话中调用来启动它(作为后台作业)screen

相关内容