在cron作业中按顺序运行两个命令?

med*_*pir 43 cron sh

我在cron作业中有两个命令,如下所示:

mysql -xxxxxx -pyyyyyyyyyyv -hlocalhost -e "call MyFunction1";wget -N http://mywebsite.net/path/AfterMyFunction1.php
Run Code Online (Sandbox Code Playgroud)

但在我看来,他们两个都在同一时间运行.

如何运行第一个命令,何时完成,执行第二个命令?

此外,AfterMyFunction1.php还有javascript http请求,当我使用wget时,这些请求不会被执行.如果我在我的webbrowser中打开AfterMyFunction1.php,它就可以工作了.

vin*_*ent 77

如果首先需要完成第一个命令,则应该像在shell中一样用&&运算符分隔它们.如果第一个失败,第二个将不会运行.

  • 如果你只有两个命令,我没有看到问题的位置以及这个文件将如何提供帮助,你也必须处理该文件(烫发,存储...),这需要更多的时间,更多的成本和更少的高效. (17认同)
  • 制作一个连续运行多个文件的脚本并编写该脚本而不是用&&的s分隔的大列表命令似乎更容易,更易于维护 (9认同)
  • 我认为这个答案不正确 - 分号将按顺序运行命令,而不是并行运行命令。所以我不认为OP的命令行有什么问题。 (2认同)

Onn*_*ous 5

您可以使用semGNU的一部分parallel

0 0 * * * root  sem --jobs 1 --id MyQueue mysql -xxxxxx -pyyyyyyyyyyv -hlocalhost -e "call MyFunction1"
1 0 * * * root  sem --jobs 1 --id MyQueue wget -N http://mywebsite.net/path/AfterMyFunction1.php
Run Code Online (Sandbox Code Playgroud)

这cron的配置将首先启动mysql通过sem,这将放在一个队列一种叫MyQueue。该队列可能为空,因此将mysql立即执行。一分钟后,cron将启动另一个sem,将cron 放在wget同一队列中。使用--jobs 1sem指示在该特定队列中一次仅执行一个作业。一旦mysql完成,第二个sem将运行wget命令。sem有很多选择来控制排队行为。例如,如果添加--semaphoretimeout -60,则等待的作业将在60秒后简单地消失。

&&解决方案可能更好,因为当第一个命令失败时它不会执行第二个命令。该sem解决方案的优势在于您可以指定不同的cron设置,例如不同的用户。如果cron间隔短于作业持续时间,它将防止cron作业重叠。