Debug School

rakesh kumar
rakesh kumar

Posted on • Edited on

How to Run Laravel Scheduler for Multiple Projects with a Single Cron Job on XAMPP/LAMPP

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
Enter fullscreen mode Exit fullscreen mode

give permission

chmod +x /opt/lampp/htdocs/run_all_schedules.sh
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

schedule in corn editor

export EDITOR=vi
crontab -e
Enter fullscreen mode Exit fullscreen mode
* * * * * /opt/lampp/htdocs/run_all_schedules.sh
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Features: Simple loop structure with error logging

  1. 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
Enter fullscreen mode Exit fullscreen mode

Features: Uses subshells for parallel execution

  1. 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"
Enter fullscreen mode Exit fullscreen mode

Features: Prevents overlapping executions

  1. 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
Enter fullscreen mode Exit fullscreen mode

Features: Uses external config file

  1. 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
Enter fullscreen mode Exit fullscreen mode

Features: Specifies environment context

  1. 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
Enter fullscreen mode Exit fullscreen mode

Features: Email alerts on failure

  1. 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
Enter fullscreen mode Exit fullscreen mode

Features: Prevents hanging processes

  1. 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
Enter fullscreen mode Exit fullscreen mode

Features: Redis-based distributed locking

  1. 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
Enter fullscreen mode Exit fullscreen mode

Features: Respects maintenance mode

  1. 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

=================================

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
Enter fullscreen mode Exit fullscreen mode

Top comments (0)