我在cron作业中有两个命令:
mysql -xxxxxx -pyyyyyyyyyyv -hlocalhost -e "call MyFunction1";wget -N http://mywebsite.net/path/AfterMyFunction1.php
但在我看来,他们两个都在同一时间运行。
如何运行第一个命令,何时完成,执行第二个命令?
AfterMyFunction1.php还有javascript http请求,当我使用wget时没有执行。如果我在我的webbrowser中打开AfterMyFunction1.php,它就可以工作。
答案 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配置将首先启动mysql
到sem
,这会将其置于一种名为MyQueue
的队列中。此队列可能为空,因此会立即执行mysql
。一分钟后,cron将启动另一个sem
,这将wget
放在同一个队列中。使用--jobs 1
,sem
被指示在该特定队列中一次只执行一个作业。 mysql
完成后,第二个sem
将运行wget
命令。 sem
有很多选项来控制排队行为。例如,如果添加--semaphoretimeout -60
,则等待作业将在60秒后死亡。
&&
解决方案可能更好,因为当第一个命令失败时它不会执行第二个命令。 sem
解决方案的优势在于您可以指定不同的cron设置,例如不同的用户。如果cron间隔短于作业持续时间,它将防止重叠的cron作业。