cron 如何处理执行多个命令的作业。
举个例子,我有一个类似这样的 cron 任务。读起来非常困难。
10 0 * * * firstscript.sh > first.log; secondscript.sh >> second.log; thirdscript.sh >> third.log 2>&1;
所有三个脚本同时执行。在我的环境中,我们有 6 个命令按顺序执行。
为什么不把同样的工作写成三个独立的工作呢?
10 0 * * * firstscript.sh > first.log;
10 0 * * * secondscript.sh >> second.log;
10 0 * * * thirdscript.sh >> third.log 2>&1;
我继承了这些工作,并试图更好地理解为什么将其作为多个命令而不是 3 个单独的工作来执行。
我能想到的第一个原因是脚本之间可能存在依赖关系。因此它们必须按照特定顺序运行。因此
secondscript.sh
取决于firestscript.sh
完成情况。第二个原因是这些脚本/命令的执行成本很高,按顺序运行时服务器运行得更好。潜在的文件锁定和多个命令写入同一文件也可能导致问题。
如果第一个脚本因错误退出,后面的命令会运行吗?
如果依赖关系是个问题,有没有办法将作业拆分成多个作业,同时仍然满足依赖关系?
cron 有这样的功能吗?
答案1
关于你的第一点,你的 crontab 都不能确保正确的依赖关系解析,因为无论前一个命令是否发出,都会执行每个命令。为此,你需要&&
在命令之间使用运算符。这也回答了你最后 3 个问题中的第一个。
你的第二点可能是对的,这取决于上下文。虽然我怀疑将所有命令写在一行中的原因是因为在最后添加一些内容比添加一行新的时间表更容易。一个原因也可能是维护:如果你想更改所有命令的时间表,那么只更改一行会更容易。
对于您最后 3 个问题中的第二个问题,答案是肯定的,但可能很复杂。您必须手动确定哪个任务可以安全地与哪个任务同时运行,并设置一种机制,让下一组任务知道前一组任务是否成功。Cron 没有任何内置功能可以帮助您。