我在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,它就可以工作了.
您可以使用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
Run Code Online (Sandbox Code Playgroud)
这cron的配置将首先启动mysql
通过sem
,这将放在一个队列一种叫MyQueue
。该队列可能为空,因此将mysql
立即执行。一分钟后,cron将启动另一个sem
,将cron 放在wget
同一队列中。使用--jobs 1
,sem
指示在该特定队列中一次仅执行一个作业。一旦mysql
完成,第二个sem
将运行wget
命令。sem
有很多选择来控制排队行为。例如,如果添加--semaphoretimeout -60
,则等待的作业将在60秒后简单地消失。
该&&
解决方案可能更好,因为当第一个命令失败时它不会执行第二个命令。该sem
解决方案的优势在于您可以指定不同的cron设置,例如不同的用户。如果cron间隔短于作业持续时间,它将防止cron作业重叠。