如何为两个单独的应用程序每分钟触发一次cron?

时间:2019-03-06 16:28:36

标签: php laravel-5 cron

我们有两个Laravel(L5.7)应用程序通过虚拟主机在单个服务器上运行。如果我运行:

crontab -e

通过终端我看到:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

* * * * * php /var/www/html/app1/artisan schedule:run >> /dev/null 2>&1
* * * * * php /var/www/html/app2/artisan schedule:run >> /dev/null 2>&1

我已经尝试了一段时间,以了解为什么app2的计划任务无法在Laravel中触发,并得出结论,cron并未为此而触发。为了测试这一点,我解雇了:

service cron status

并(每分钟)始终(每分钟)始终显示第一个命令正在触发:

Mar 06 16:23:01 SRV-PHP7-SVR CRON[22216]: (user) CMD (php /var/www/html/app1/artisan schedule:run >> /dev/null 2>&1)

app2不适用。然后,我通过删除以下行进行了测试:

* * * * * php /var/www/html/app1/artisan schedule:run >> /dev/null 2>&1

从crontab中运行,然后在我运行service cron status时显示:

Mar 06 16:16:01 SRV-PHP7-SVR CRON[22033]: (user) CMD (php /var/www/html/app2/artisan schedule:run >> /dev/null 2>&1)

我如何在两个应用程序上都运行同一分钟的cron而不重叠?

1 个答案:

答案 0 :(得分:0)

在b̶a̶n̶g̶i̶n̶g̶m̶y̶̶h̶a̶d̶̶a̶g̶a̶i̶n̶s̶t̶̶m̶y̶̶d̶e̶s̶k̶做了很多调试之后,我发现了即使cron是我的代码也无法触发的原因。这不是我最初想到的crontab问题,它似乎是一个权限问题,没有在日志中报告。在整个计划函数中,我分散在Log::info的各种调用中:

Log::info('--------------------------------------------------------------------------');
Log::info('--------------------- Cron Fired: ' . date('Y-m-d H:i:s') . ' --------------------');
Log::info('--------------------------------------------------------------------------');

似乎是引起问题的原因。我得出此结论的方式是注释掉所有Log::info调用,并创建一个名为cron的小表,该表有两列; logcreated_at,然后将以下代码片段放入设置为每分钟触发的函数中:

DB::table('cron')->insert(['log' => 'Scheduler found ' . $rows->count() . ' rows that need to be checked']);

与我使用Log::info时不同,它每分钟都会持续创建行。

让我的问题更加复杂的是,当我手动触发计划时,我正在运行以下命令:

sudo php artisan schedule:run

并且由于sudo,权限问题不再是问题,因此增加了调试时间。