在Cron中同时运行多个PHP脚本

4

我有一个类似以下的crontab

* 22 * * * php /var/www/domain1/cron.php
* 22 * * * php /var/www/domain2/cron.php
* 22 * * * php /var/www/domain3/cron.php
* 22 * * * php /var/www/domain4/cron.php
...

然而,上述脚本似乎会出现混乱并且每次运行达到一百次!我不确定为什么会这样,但由于它们都设置在同一时间启动,所以我建议尝试更改此设置。需要指出的是,如果我手动运行每个cron文件,则不会出现这种行为,并且可以得到预期的行为。
我是否可以让cron一次只运行一行?因此,当运行domain1/cron.php时,它不会在domain1/cron.php完成之前运行domain2/cron.php?
我无法更改它们的时间,因为我无法确定每个时间的结束时间。在一个域上可能需要3秒钟,而在另一个域上可能需要30分钟。

1
“* 22” 表示在晚上 22:00、22:01、22:02、22:03 到 22:59 运行脚本。因此每个脚本将运行 60 次。 - Barmar
原来这是我的错误。我真蠢。当然它只应该运行一次,也就是说它应该是 0 22 * * * - Daniel Jørgensen
3个回答

7
如果您拥有root权限,您可以尝试以下方法。
* 22 * * * /root/sbin/allDomainsCron.sh

在 allDomainsCron.sh 文件中,逐一包含您的域名的 cron.php 文件:

#!bin/bash
php /var/www/domain1/cron.php
php /var/www/domain2/cron.php
php /var/www/domain3/cron.php
php /var/www/domain4/cron.php
...

你可以确保只有一个cron.php在运行。

如果你想每天22:00运行该脚本,以下代码可以实现:

0 22 * * * /root/sbin/allDomainsCron.sh

我选择了这种方法来修复我的错误,因为我并不打算在22点到23点之间每分钟运行脚本,而只想运行一次。 - Daniel Jørgensen
为什么他需要 root 权限?脚本不一定要在 /root 目录中,它可以在他自己的目录中。 - Barmar
你说得对,如果脚本在其他地方,他不需要拥有root权限。当他使用我上面的示例时,如果脚本位于/root目录下,他需要拥有root权限。 - szenbalu

5
把所有命令放在一条命令行中,这样它们就会按顺序运行。
* 22 * * * php /var/www/domain1/cron.php; php /var/www/domain2/cron.php; php /var/www/domain3/cron.php; php /var/www/domain4/cron.php

但是由于这个cron任务在22小时内每分钟都会运行一次,如果它们的执行时间超过1分钟,仍然会出现重叠。


0
不,crontab 不提供有序执行。这种方式使用 cron 也不可靠。你可能想要的是一个真正的队列或作业管理器,它可以比 crontab 更可靠地有效地控制所需作业的执行结果和流程。你可以尝试使用 RabbitMQ、ZeroMQ 或 Gearman 等工具来实现。如果你正在使用 AWS,则 SQS 是一个不错的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接