Best Practices: Editing /etc/crontab vs. crontab -e for Root Tasks in Ubuntu


2 views

When configuring root-level cron jobs in Ubuntu, you essentially have two primary methods:

# Method 1: System-wide crontab
sudo nano /etc/crontab

# Method 2: User-specific crontab
sudo crontab -e

The fundamental distinction lies in how these approaches handle job definitions:

  • /etc/crontab: Requires specifying the user in each entry (format: minute hour day month day-of-week user command)
  • crontab -e: Assumes commands run as the current user (root in this case), using simpler format (minute hour day month day-of-week command)

Here's why you might choose one over the other:

# /etc/crontab example (must specify user)
0 3 * * * root /usr/sbin/logrotate
30 2 * * 1 root /usr/bin/apt-get update && /usr/bin/apt-get upgrade -y

# root's crontab -e example (user implied)
0 4 * * * /usr/local/bin/backup.sh
45 2 * * * /usr/bin/updatedb

Consider these aspects for long-term management:

  • Backup/Restore: User crontabs are easier to migrate between systems (crontab -l > backup.txt)
  • Version Control: /etc/crontab is a single file that can be tracked with configuration management tools
  • Multi-Admin Environments: /etc/crontab provides clearer visibility for all administrators

Both methods run as root, but:

  • /etc/crontab has strict permissions (typically 644 root:root)
  • User crontabs are stored in /var/spool/cron/crontabs with tighter permissions
  • The crontab command includes syntax checking before saving

For system maintenance tasks that:

  • Are fundamental to OS operation → Use /etc/crontab
  • Are specific to root's environment → Use crontab -e
  • Require clear documentation → Use /etc/crontab with comments

Example of a well-documented /etc/crontab entry:

# System maintenance - rotate logs daily at 3:15 AM
15 3 * * * root /usr/sbin/logrotate /etc/logrotate.conf

# Weekly security updates - runs apt-get but doesn't auto-install
30 2 * * 1 root /usr/bin/apt-get update && /usr/bin/apt-get --dry-run upgrade

When configuring scheduled tasks as root on Ubuntu systems, you essentially have two primary methods:

# Method 1: Directly edit /etc/crontab
sudo nano /etc/crontab

# Method 2: Use root's personal crontab
sudo crontab -e

The fundamental distinction lies in how these methods are processed:

  • /etc/crontab: A system-wide file that requires explicit user specification in each entry
  • crontab -e: User-specific configuration where the executing user is implied

For root-level system maintenance tasks, here's what experienced sysadmins typically consider:

# /etc/crontab example (note required user field)
* * * * * root /usr/local/bin/daily_maintenance.sh

# crontab -e example (user implied)
* * * * * /usr/local/bin/security_scan.sh

Based on Ubuntu's package maintenance patterns and convention:

  • Use /etc/crontab for:
    • Package-maintained cron jobs
    • Tasks that might need to be disabled via /etc/cron.d/
    • Jobs that specifically document their use in /etc/crontab
  • Use crontab -e for:
    • Personal root maintenance scripts
    • Temporary debugging tasks
    • When you need environment variables from root's profile

Here's a more complex example showing both methods:

# /etc/crontab entry for log rotation
0 3 * * * root /usr/sbin/logrotate -f /etc/logrotate.conf >/var/log/logrotate.log 2>&1

# crontab -e entry for custom backup
0 2 * * * /root/scripts/backup_db.sh --full | mail -s "DB Backup Report" admin@example.com
  • Always test scripts with run-parts --test /etc/cron.daily before deployment
  • For environment issues, note that /etc/crontab uses a minimal environment
  • Consider using /etc/cron.d/ for better organization of system jobs

If you're managing configurations with Git:

# For /etc/crontab tracking
sudo cp /etc/crontab /usr/local/etc/crontab.backup
git add /usr/local/etc/crontab.backup

# For root's crontab
sudo crontab -l > ~/crontab-root.backup
git add ~/crontab-root.backup