我们有两个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而不重叠?
答案 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
的小表,该表有两列; log
和created_at
,然后将以下代码片段放入设置为每分钟触发的函数中:
DB::table('cron')->insert(['log' => 'Scheduler found ' . $rows->count() . ' rows that need to be checked']);
与我使用Log::info
时不同,它每分钟都会持续创建行。
让我的问题更加复杂的是,当我手动触发计划时,我正在运行以下命令:
sudo php artisan schedule:run
并且由于sudo
,权限问题不再是问题,因此增加了调试时间。