我正在设置一些 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
。