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

时间:2012-03-09 18:52:24

标签: cron sh

我在cron作业中有两个命令:

mysql -xxxxxx -pyyyyyyyyyyv -hlocalhost -e "call MyFunction1";wget -N http://mywebsite.net/path/AfterMyFunction1.php

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

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

AfterMyFunction1.php还有javascript http请求,当我使用wget时没有执行。如果我在我的webbrowser中打开AfterMyFunction1.php,它就可以工作。

2 个答案:

答案 0 :(得分:77)

如果需要先完成第一个命令,则应将其与the && operator分开,就像在shell中一样。如果第一个失败,则第二个不会运行。

答案 1 :(得分:6)

您可以使用sem,它是GNU 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

此cron配置将首先启动mysqlsem,这会将其置于一种名为MyQueue的队列中。此队列可能为空,因此会立即执行mysql。一分钟后,cron将启动另一个sem,这将wget放在同一个队列中。使用--jobs 1sem被指示在该特定队列中一次只执行一个作业。 mysql完成后,第二个sem将运行wget命令。 sem有很多选项来控制排队行为。例如,如果添加--semaphoretimeout -60,则等待作业将在60秒后死亡。

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