How to Run Laravel Scheduler for Multiple Projects with a Single Cron Job on XAMPP/LAMPP
create script file run_all_schedules.sh
touch run_all_schedules.sh
give permission
chmod +x /opt/lampp/htdocs/run_all_schedules.sh
write script for multiple project
#!/bin/bash
export PATH=$PATH:/opt/lampp/bin
for dir in motoshare.co motoshare.in motoshare.ca motoshare.us motoshare.mx
do
cd /opt/lampp/htdocs/$dir/motoshare-web
/opt/lampp/bin/php artisan schedule:run >> /dev/null 2>&1
done
schedule in corn editor
export EDITOR=vi
crontab -e
* * * * * /opt/lampp/htdocs/run_all_schedules.sh
Some other fields
Basic Multi-Project Scheduler with Logging
#!/bin/bash
LAMPP_PHP="/opt/lampp/bin/php"
BASE_DIR="/opt/lampp/htdocs"
for project in project1 project2 project3; do
cd "$BASE_DIR/$project" || { echo "Failed: $project" >> /var/log/scheduler_errors.log; continue; }
$LAMPP_PHP artisan schedule:run >> /var/log/scheduler.log 2>&1
done
Features: Simple loop structure with error logging
- Parallel Execution with Background Jobs
#!/bin/bash
export PATH=$PATH:/opt/lampp/bin
for dir in clientA clientB clientC; do
(cd "/opt/lampp/htdocs/$dir" && php artisan schedule:run >> /dev/null 2>&1) &
done
wait
Features: Uses subshells for parallel execution
- Lock File Prevention System
#!/bin/bash
LOCK_FILE="/tmp/scheduler.lock"
if [ -f "$LOCK_FILE" ]; then exit 1; fi
touch "$LOCK_FILE"
/opt/lampp/bin/php /opt/lampp/htdocs/projectA/artisan schedule:run
/opt/lampp/bin/php /opt/lampp/htdocs/projectB/artisan schedule:run
rm -f "$LOCK_FILE"
Features: Prevents overlapping executions
- Dynamic Project Configuration
#!/bin/bash
readarray -t PROJECTS < /opt/lampp/scheduler_projects.conf
for project in "${PROJECTS[@]}"; do
(cd "/opt/lampp/htdocs/$project" && \
/opt/lampp/bin/php artisan schedule:run >> "/var/log/$project-scheduler.log" 2>&1)
done
Features: Uses external config file
- Environment-Specific Execution
#!/bin/bash
ENV="production"
for project in site1 site2 site3; do
cd "/opt/lampp/htdocs/$project" && \
/opt/lampp/bin/php artisan schedule:run --env=$ENV >> /dev/null 2>&1
done
Features
: Specifies environment context
- Error Notification System
#!/bin/bash
ADMIN_EMAIL="admin@example.com"
for project in webapp1 webapp2; do
output=$(/opt/lampp/bin/php /opt/lampp/htdocs/$project/artisan schedule:run 2>&1)
if [ $? -ne 0 ]; then
echo "$output" | mail -s "Scheduler Error: $project" $ADMIN_EMAIL
fi
done
Features
: Email alerts on failure
- Timeout-Protected Execution
#!/bin/bash
TIMEOUT=300 # 5 minutes per project
for project in portal1 portal2; do
timeout $TIMEOUT /opt/lampp/bin/php \
/opt/lampp/htdocs/$project/artisan schedule:run >> /dev/null 2>&1
done
Features: Prevents hanging processes
- Multi-Server Coordination
#!/bin/bash
REDIS_CLI="/usr/bin/redis-cli"
for project in app1 app2; do
LOCK_KEY="scheduler:$project:lock"
if [ "$($REDIS_CLI SET $LOCK_KEY 1 NX EX 60)" == "OK" ]; then
/opt/lampp/bin/php /opt/lampp/htdocs/$project/artisan schedule:run
$REDIS_CLI DEL $LOCK_KEY
fi
done
Features
: Redis-based distributed locking
- Maintenance Mode Check bash
#!/bin/bash
for project in store1 store2; do
if [ ! -f "/opt/lampp/htdocs/$project/storage/framework/down" ]; then
/opt/lampp/bin/php /opt/lampp/htdocs/$project/artisan schedule:run
fi
done
Features: Respects maintenance mode
- Health Check Integration
#!/bin/bash
HEALTH_CHECK_URL="https://health.example.com/ping"
for project in api1 api2; do
start=$(date +%s)
/opt/lampp/bin/php /opt/lampp/htdocs/$project/artisan schedule:run
duration=$(( $(date +%s) - start ))
curl -fsS -m 10 --retry 5 -o /dev/null "$HEALTH_CHECK_URL/$project?duration=$duration"
done
Features
: Health monitoring integration
#!/bin/bash
export PATH=$PATH:/opt/lampp/bin
# Mapping directories to their corresponding URLs
declare -A sites
sites=(
[motoshare.co]="https://motoshare.co"
[motoshare.in]="https://motoshare.in"
[motoshare.ca]="https://motoshare.ca"
[motoshare.us]="https://motoshare.us"
[motoshare.mx]="https://motoshare.mx"
)
for dir in "${!sites[@]}"
do
cd /opt/lampp/htdocs/$dir/motoshare-web || continue
# Check if the site is up
STATUS=$(curl -s -o /dev/null -w "%{http_code}" "${sites[$dir]}/")
if [ "$STATUS" -ne 200 ]; then
echo "Site ${sites[$dir]} is down (status: $STATUS). Running chown."
chown -R daemon:daemon .
fi
# Run Laravel schedule
/opt/lampp/bin/php artisan schedule:run >> /dev/null 2>&1
done
=================================
if [ "$STATUS" -ne 200 ]; then
if [ "$STATUS" -eq 500 ]; then
echo "Site ${sites[$dir]} returned status 500 (Internal Server Error)."
# Add any specific action for 500 here
fi
echo "Site ${sites[$dir]} is down (status: $STATUS). Running chown."
chown -R daemon:daemon .
fi
Top comments (0)