【问题标题】:Running two commands sequentially in a cron job?在 cron 作业中按顺序运行两个命令?
【发布时间】:2012-03-27 05:18:41
【问题描述】:

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

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

但在我看来,它们都在同时运行。

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

AfterMyFunction1.php 也有在我使用 wget 时未执行的 javascript http 请求。如果我在我的网络浏览器中打开 AfterMyFunction1.php,它就可以工作。

【问题讨论】:

  • wget 无法解析和执行您检索的 HTML 页面中嵌入的 javascript。 wget 不呈现页面,它只是检索内容。

标签: cron sh


【解决方案1】:

如果需要先完成第一个命令,您应该像在 shell 中那样使用the && operator 将它们分开。如果第一个失败,第二个将不会运行。

【讨论】:

  • 创建一个连续运行多个文件并调度该脚本的脚本与用 && 分隔的大列表命令似乎更容易、更易于维护
  • 如果你只有两个命令,我看不出问题出在哪里以及这个文件有什么帮助,你也必须照顾那个文件(烫发,存储......),这个需要更多时间成本更高,效率更低。
  • 我认为这个答案不正确 - 分号将按顺序运行命令,而不是并行运行。所以我认为 OP 的命令行没有任何问题。
  • @BigDong 搜索做同样事情但有更多命令的人可能会发现这个问题,所以 JustinP 的评论是明智的
【解决方案2】:

您可以使用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 作业。

【讨论】:

  • sem 不会返回实用程序的rc(在本例中为 mysq 或 wget)。因此,当实用程序失败时,cron 不会发送电子邮件。
猜你喜欢
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 2016-05-09
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多