When examining /etc/crontab
, we see the standard system-wide cron jobs configuration:
# m h dom mon dow user command
27 * * * * root cd / && run-parts --report /etc/cron.hourly
58 15 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
0 15 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
20 15 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
To force execution of these jobs, you have several options:
Method 1: Directly Run the Commands
# For hourly jobs
sudo cd / && run-parts --report /etc/cron.hourly
# For daily jobs
sudo test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
Method 2: Using Cron Debug Mode
# Add this line to temporarily debug all cron jobs
* * * * * /usr/bin/logger -t CRON "Testing cron job execution"
Checking System Logs
# Check cron logs on Debian/Ubuntu
grep CRON /var/log/syslog
# On CentOS/RHEL
grep CRON /var/log/cron
Adding Execution Logging
Modify your cron jobs to include logging:
# Original
27 * * * * root cd / && run-parts --report /etc/cron.hourly
# Modified with logging
27 * * * * root (cd / && run-parts --report /etc/cron.hourly) >> /var/log/cron_hourly.log 2>&1
- PATH issues: Cron jobs run with minimal environment variables
- Permission problems: Ensure scripts are executable (chmod +x)
- Time zone mismatches: Check system time vs. cron time
For production systems, consider implementing:
# Sample monitoring script
#!/bin/bash
LOG_FILE="/var/log/cron_monitor.log"
LAST_RUN=$(stat -c %Y /etc/cron.hourly)
CURRENT_TIME=$(date +%s)
DIFF=$((CURRENT_TIME - LAST_RUN))
if [ $DIFF -gt 4000 ]; then
echo "$(date) - Cron jobs not running!" >> $LOG_FILE
fi
The cron configuration you're showing in /etc/crontab
follows the standard Linux format:
# m h dom mon dow user command
27 * * * * root cd / && run-parts --report /etc/cron.hourly
58 15 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
0 15 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
20 15 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
To check if your cron jobs are running as scheduled:
# Check cron logs (systemd systems)
journalctl -u cron -n 50 --no-pager
# Traditional syslog approach
grep CRON /var/log/syslog | tail -20
# For specific user's jobs
crontab -l -u username
While you can't directly "execute crontab" as a whole, you can manually trigger the scripts:
# For hourly jobs
sudo run-parts --test /etc/cron.hourly
sudo run-parts --verbose /etc/cron.hourly
# For daily jobs (bypassing anacron check)
sudo bash -c "cd / && run-parts --report /etc/cron.daily"
Modify your jobs to include explicit logging:
# Sample modified cron.daily entry
58 15 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily >> /var/log/cron.daily.log 2>&1 )
Here's a script to verify job execution timestamps:
#!/bin/bash
# cron-verify.sh
LOG_DIR="/var/log/cron"
mkdir -p "$LOG_DIR"
verify_job() {
local job_name=$1
local job_path=$2
local timestamp=$(date +"%Y-%m-%d_%H-%M-%S")
echo "[$timestamp] Verifying $job_name" >> "$LOG_DIR/cron_verify.log"
if [ -d "$job_path" ]; then
for script in "$job_path"/*; do
if [ -x "$script" ]; then
echo "Executing: $script" >> "$LOG_DIR/cron_verify.log"
"$script" >> "$LOG_DIR/${job_name}_exec.log" 2>&1
fi
done
fi
}
verify_job "hourly" "/etc/cron.hourly"
verify_job "daily" "/etc/cron.daily"
verify_job "weekly" "/etc/cron.weekly"
verify_job "monthly" "/etc/cron.monthly"
Consider these tools for better cron management:
# Install testcron (Debian/Ubuntu)
sudo apt-get install cron-apt
# Sample testcron usage
testcron -f /etc/crontab -u root