Cron 作业在 Elastic Beanstalk 中不起作用
Cron job not working in Elastic Beanstalk
我已经使用负载平衡在 Elastic Beanstalk 中部署了一个 laravel 应用程序。我必须每天备份我的数据库并将其存储在 s3 存储桶中,所以我使用 Laravel-backup-server
包。我已经使用 Nginx 设置了 cronjob。当我在我的本地机器上手动 运行 php artisan schedule:run
它工作正常但是当我部署到 Aws 时它不是 运行 宁 cron 作业。我的设置看起来像这样
.ebextensions/cron-setup.config
"/etc/cron.d/cron_example":
mode: "000644"
owner: root
group: root
content: |
* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/artisan schedule:run 1>> /laralog.log 2>&1
commands:
rm_old_cron:
command: "rm -fr /etc/cron.d/cron_example.bak"
ignoreErrors: true
app\Console\Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('backup:run --only-db')
->everyMinute();
Log::info('running cron');
}
我正在使用 cloudwatch 进行日志记录。当我在本地 运行 php artisan schedule:run
时,我正在登录云监视。但是当我将它部署到 Elastic beanstalk 并在 ngnix 中设置 cron 时,没有日志。
此外,我尝试使用我在 Github 中找到的这个配置我没有做任何更改但没有工作
files:
"/etc/cron.d/schedule_run":
mode: "000644"
owner: root
group: root
content: |
* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/artisan schedule:run 1>> /dev/null 2>&1
commands:
remove_old_cron:
command: "rm -f /etc/cron.d/*.bak"
创建新的 cron 文件后尝试重新加载 cron 服务。
service cron reload
或您的 EB 正在使用的 OS 之类的东西。
这是我在 EBS 上的做法:
files:
"/etc/cron.d/artisan-scheduler":
mode: "000644"
owner: root
group: root
content: |
* * * * * webapp /usr/local/bin/artisan-scheduler-cron.sh
"/var/log/laravel-schedule.log":
mode: "000755"
owner: webapp
group: webapp
content: |
created
"/usr/local/bin/artisan-scheduler-cron.sh":
mode: "000755"
owner: webapp
group: webapp
content: |
#!/bin/bash
/usr/bin/php /var/app/current/artisan schedule:run >> /var/log/laravel-schedule.log 2>&1
exit 0
commands:
01_mkdir_webapp_dir:
# use the test directive to create the directory
# if the mkdir command fails the rest of this directive is ignored
test: "mkdir /home/webapp"
command: "ls -la /home/webapp"
02_chown_webapp_dir:
command: "chown webapp:webapp /home/webapp"
03_chmod_webapp_dir:
command: "chmod 700 /home/webapp"
remove_old_cron:
command: "rm -f /etc/cron.d/artisan-scheduler.bak"
最后,我从脚本调用 artisan 并 运行 Cron 作业中的脚本。 Laravel 时间表在 Kernel.php
中照常宣布。请注意,“日志”部分与您的问题无关。
您也可以尝试一个简单的计划任务来检查计划程序是否工作:
$schedule->call(function () {
Log::info('[SCHEDULE] test schedule');
})
->name('test-schedule')
->withoutOverlapping(720) //12h
->everyMinute()
->onOneServer();
此外,SSH 到您的服务器并检查其他日志。 artisan 命令可能还有另一个错误,但在“shell”级别,它没有达到 PHP/Laravel,因此 Cloudwatch 中没有关于它的日志。
经过多次努力,我找到了一种替代方法 运行 cron 作业
创建路线
routes/web.php
Route::get('/cron/run',[HomeController::class, 'cron'])->name('cron');
在 HomeController 中创建一个函数
public function cron()
{
\Artisan::call("schedule:run");
return 'run cron successful';
}
运行 URL 每分钟使用
https://cron-job.org/en/
我已经使用负载平衡在 Elastic Beanstalk 中部署了一个 laravel 应用程序。我必须每天备份我的数据库并将其存储在 s3 存储桶中,所以我使用 Laravel-backup-server
包。我已经使用 Nginx 设置了 cronjob。当我在我的本地机器上手动 运行 php artisan schedule:run
它工作正常但是当我部署到 Aws 时它不是 运行 宁 cron 作业。我的设置看起来像这样
.ebextensions/cron-setup.config
"/etc/cron.d/cron_example":
mode: "000644"
owner: root
group: root
content: |
* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/artisan schedule:run 1>> /laralog.log 2>&1
commands:
rm_old_cron:
command: "rm -fr /etc/cron.d/cron_example.bak"
ignoreErrors: true
app\Console\Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('backup:run --only-db')
->everyMinute();
Log::info('running cron');
}
我正在使用 cloudwatch 进行日志记录。当我在本地 运行 php artisan schedule:run
时,我正在登录云监视。但是当我将它部署到 Elastic beanstalk 并在 ngnix 中设置 cron 时,没有日志。
此外,我尝试使用我在 Github 中找到的这个配置我没有做任何更改但没有工作
files:
"/etc/cron.d/schedule_run":
mode: "000644"
owner: root
group: root
content: |
* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/artisan schedule:run 1>> /dev/null 2>&1
commands:
remove_old_cron:
command: "rm -f /etc/cron.d/*.bak"
创建新的 cron 文件后尝试重新加载 cron 服务。
service cron reload
或您的 EB 正在使用的 OS 之类的东西。
这是我在 EBS 上的做法:
files:
"/etc/cron.d/artisan-scheduler":
mode: "000644"
owner: root
group: root
content: |
* * * * * webapp /usr/local/bin/artisan-scheduler-cron.sh
"/var/log/laravel-schedule.log":
mode: "000755"
owner: webapp
group: webapp
content: |
created
"/usr/local/bin/artisan-scheduler-cron.sh":
mode: "000755"
owner: webapp
group: webapp
content: |
#!/bin/bash
/usr/bin/php /var/app/current/artisan schedule:run >> /var/log/laravel-schedule.log 2>&1
exit 0
commands:
01_mkdir_webapp_dir:
# use the test directive to create the directory
# if the mkdir command fails the rest of this directive is ignored
test: "mkdir /home/webapp"
command: "ls -la /home/webapp"
02_chown_webapp_dir:
command: "chown webapp:webapp /home/webapp"
03_chmod_webapp_dir:
command: "chmod 700 /home/webapp"
remove_old_cron:
command: "rm -f /etc/cron.d/artisan-scheduler.bak"
最后,我从脚本调用 artisan 并 运行 Cron 作业中的脚本。 Laravel 时间表在 Kernel.php
中照常宣布。请注意,“日志”部分与您的问题无关。
您也可以尝试一个简单的计划任务来检查计划程序是否工作:
$schedule->call(function () {
Log::info('[SCHEDULE] test schedule');
})
->name('test-schedule')
->withoutOverlapping(720) //12h
->everyMinute()
->onOneServer();
此外,SSH 到您的服务器并检查其他日志。 artisan 命令可能还有另一个错误,但在“shell”级别,它没有达到 PHP/Laravel,因此 Cloudwatch 中没有关于它的日志。
经过多次努力,我找到了一种替代方法 运行 cron 作业
创建路线
routes/web.php
Route::get('/cron/run',[HomeController::class, 'cron'])->name('cron');
在 HomeController 中创建一个函数
public function cron()
{
\Artisan::call("schedule:run");
return 'run cron successful';
}
运行 URL 每分钟使用 https://cron-job.org/en/