Check WordPress wp-cron Count with WP-CLI + Monit + Email Alerts

Monit is a very flexible Montiroing tool to help ensure your services are always running. It can be used to send email alerts (guide with Mailgun) when processes crash and automatically restart them. On all the VPS and dedicated servers I set up for my clients on Codeable, I configure Monit for proactive monitoring.

wp-cron can sometimes stall and have thousands of latent cronjobs that haven’t run. Instead of monitoring this manually, this tutorial will show you how to use bash and WP-CLI to count how many cronjobs are in the wp-cron queue. Taking it one step further we will configure Monit to use this bash script and alert you by email if the number of cronjobs in queue exceed a certain number that you specify. This post is based on how to monitor WordPress folder size with Monit.

Check WordPress wp-cron Count with Monit + Email Alert

This WP-CLI command will list the cron events

wp cron event list

To get the count we can remove the column headers line from the table with sed and then count the lines with wc

wp cron event list --allow-root --skip-plugins --skip-themes | sed -n '1!p' | wc -l

Create the script

mkdir ~/scripts
nano ~/scripts/wpcronchecker.sh

Paste the script which takes the WordPress path as the first argument and number of cronjobs to alert if exceeded as the second argument

#!/bin/bash
# Author Mike from https://guides.wp-bullet.com

#capture first passed variable
WPPATH=$1

#capture second passed variable
CRONTHRESHOLD=$2

#get cronjob count
WPCRONCOUNT=$(wp cron event list --path=$WPPATH --allow-root --skip-plugins --skip-themes | sed -n '1!p' | wc -l)

#output cronjobs so Monit can capture it
echo "$WP_PATH has $WPCRONCOUNT cronjobs"

#provide status code for alert
if [[ $WPCRONCOUNT -gt $(( $CRONTHRESHOLD )) ]]; then
    exit 1
fi

Make the script executable

chmod +x wpcronchecker.sh

Test running the script by passing your path to the WordPress installation folder as the first parameter and the number of cronjobs that, if exceeded, should trigger an alert

bash wpcronchecker.sh /var/www/guides.wp-bullet.com/ 50

You will get this output

/var/www/guides.wp-bullet.com/ has 12 cronjobs

Now we can configure Monit to use this bash script and display its output

Configure Monit to Check wp-cron

Assuming you have a modular system for creating Monit configurations as outlined in the Monit installation guide, create the new snippet

sudo nano /etc/monit/conf.d/wpcroncheck

If the WordPress installation in /var/www/guides.wp-bullet.com has cronjobs in queue  greater than 50 we will get an email alert.

Then every 1440 cycles line means Monit will check every 1440x the Monit interval defined in /etc/monit/monitrc

check program wp-cron
    with path "/root/scripts/wpcronchecker.sh /var/www/guides.wp-bullet.com/ 50"
    every 1440 cycles
    if status != 0 then alert

Ctrl+X, Y and Enter to Save and Exit.

Test Monit syntax is valid with our new addition of disk space checking and alerting.

sudo monit -t

Reload Monit if there were no errors

sudo service monit reload

Check in Monit and you can see the Program wp-cron running 🙂

Sources

wp cron Command
Remove first line from bash output