Cron Jobs Complete Guide
Overview
Cron is a time-based job scheduler for automatating scripts and commands. Essential for backups, maintenance, and monitoring tasks.
Basic Cron Syntax
Understanding Cron Expression
┌───────────── minute (0 - 59)
│ ┌─────────── hour (0 - 23)
│ │ ┌──────── day of month (1 - 31)
│ │ │ ┌────── month (1 - 12)
│ │ │ │ ┌──── day of week (0 - 6) (Sunday=0)
│ │ │ │ │
* * * * * command
Cron Examples
Basic Examples
# Every minute
* * * * * /root/script.sh
# Every hour
0 * * * * /root/script.sh
# Every day at 2 AM
0 2 * * * /root/script.sh
# Every Monday at 3 AM
0 3 * * 1 /root/script.sh
# Every 15 minutes
*/15 * * * * /root/script.shCommon Schedules
# Daily at 2 AM
0 2 * * * /root/backup.sh
# Weekly Sunday at 2 AM
0 2 * * 0 /root/cleanup.sh
# Monthly 1st at 2 AM
0 2 1 * * /root/monthly.sh
# Every 5 minutes
*/5 * * * * /root/monitor.sh
# Every 30 minutes
*/30 * * * * /root/check.shManaging Cron Jobs
Add Cron Job
# Edit crontab
crontab -e
# Or use specific file
crontab /root/my-cronjobs
# System cron (all users)
nano /etc/crontabList Cron Jobs
# Current user crontab
crontab -l
# Specific user
crontab -u root -l
# System cron
cat /etc/crontabRemove Cron Job
# Remove all
crontab -r
# Remove without confirmation
crontab -irCron Environment
PATH Setting
# Set PATH in crontab
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Or absolute path
0 2 * * * /usr/local/bin/backup.shOutput Handling
# Redirect output
0 2 * * * /root/script.sh > /root/script.log 2>&1
# Send email (if configured)
0 2 * * * /root/script.sh
# Discard output
0 2 * * * /root/script.sh > /dev/null 2>&1Special Characters
Characters Meaning
| Character | Meaning |
|---|---|
| * | Any value |
| , | Value list (1,2,3) |
| - | Range (1-5) |
| / | Step (*/5) |
Examples
# 1, 2, or 3
0 2 * * 1,3,5 /root/script.sh
# 1 through 5
0 2 * * 1-5 /root/script.sh
# Every 2 hours
0 */2 * * * /root/script.sh
# Every 30 minutes
0,30 * * * * /root/script.shProxmox Specific Cron
Backup Jobs
# Daily backup at 2 AM
0 2 * * * vzdump --mode suspend --vmid 100 --storage local
# Multiple VMs
0 2 * * * for vm in 100 101 102; do vzdump --mode suspend --vmid $vm --storage local; doneMaintenance Jobs
# Clean old logs daily
0 3 * * * find /var/log -name "*.log" -mtime +30 -delete
# Update package index
0 4 * * * apt update -y
# Check VM status
*/15 * * * * qm list | grep runningTroubleshooting Cron
Not Running
# Check cron service
systemctl status cron
# Check logs
grep CRON /var/log/syslog
# Check mail
mailPermission Issues
# Make script executable
chmod +x /root/script.sh
# Check ownership
chown root:root /root/script.shBest Practices
Script Template
#!/bin/bash
# backup.sh - Backup script
# Exit on error
set -e
# Log
exec > >(logger -t backup) 2>&1
echo "Starting backup..."
# Your commands here
vzdump --mode suspend --vmid 100 --storage local
echo "Backup complete"Lock Files
#!/bin/bash
# Prevent multiple instances
LOCKFILE=/var/lock/backup.lock
if [ -f $LOCKFILE ]; then
echo "Already running"
exit 1
fi
touch $LOCKFILE
trap "rm -f $LOCKFILE" EXIT
# Your commands hereKeywords
cron scheduler automation crontab cronjob