'Cron job not working in Elastic Beanstalk
I have deployed a laravel application in Elastic Beanstalk with Load Balancing. I have to backup my database daily and store it in s3 bucket so I am using Laravel-backup-server package. And I have set up cronjob using Nginx. When I manually run php artisan schedule:run in my local machine it works fine but when I deploy to Aws it's not running the cron job. My setup looks something like this
.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');
}
I am using cloudwatch for logging. And when I run php artisan schedule:run locally I am getting a log in cloud watch. But when I deploy it to Elastic beanstalk and set up cron in ngnix there is no log.
Also, I tried to use this config which I found in Github I didn't make any changes but not working
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"
Solution 1:[1]
After several efforts I found a alternative way to run cron job easily
Create a route
routes/web.php
Route::get('/cron/run',[HomeController::class, 'cron'])->name('cron');
create a function in the HomeController
public function cron()
{
\Artisan::call("schedule:run");
return 'run cron successful';
}
Run the URL every minute using https://cron-job.org/en/
Solution 2:[2]
Try to reload cron service after new cron file is created.
service cron reload
or something like that for OS your EB is using.
Solution 3:[3]
This is how I did it on 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"
In the end, I make the artisan call from a script and run the script in the Cron job. Laravel schedules are declared as usual in the Kernel.php. Note that the "log" parts are not relevant to your issue.
You could also try a simple scheduled task to check if the scheduler work:
$schedule->call(function () {
Log::info('[SCHEDULE] test schedule');
})
->name('test-schedule')
->withoutOverlapping(720) //12h
->everyMinute()
->onOneServer();
Also, SSH to your server and check other logs. There may be another error on the artisan command, but on the "shell" level, it does not reach PHP/Laravel, and so no logs in Cloudwatch about it.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Tomasz Bre? |
| Solution 3 | Mtxz |

