'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 |