Как запускать крону каждую минуту для двух отдельных приложений? - PullRequest
1 голос
/ 06 марта 2019

У нас есть два приложения 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

Я уже некоторое время пытаюсь выяснить, почему запланированные задачи не запускаются в Laravel для app2, и пришел к выводу, что хрон не запускает его. Чтобы проверить это, я запустил:

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 голосов
/ 07 марта 2019

После того, как 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, что, следовательно, увеличило время отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...