Linux scheduled tasks (cron) are an important tool for automated operations, allowing scripts and commands to be executed regularly.
cron basic concepts:
- cron is the scheduled task scheduler for Linux systems
- The cron daemon (crond) is responsible for executing scheduled tasks
- Configuration files: /etc/crontab (system-level), /var/spool/cron/username (user-level)
- Time format: minute hour day month week command
Time format explanation:
- minute (0-59): which minute of the hour
- hour (0-23): which hour of the day
- day (1-31): which day of the month
- month (1-12): which month of the year
- week (0-7, 0 and 7 both represent Sunday): which day of the week
Special symbols:
- *: match all values
- ,: separate multiple values, e.g., 1,3,5 means 1st, 3rd, 5th
- -: indicate range, e.g., 1-5 means 1 to 5
- /n: indicate interval, e.g., */5 means every 5 units
Common examples:
- Execute every minute: * * * * * command
- Execute every hour: 0 * * * * command
- Execute at 2 AM every day: 0 2 * * * command
- Execute at 3 AM every Monday: 0 3 * * 1 command
- Execute at 4 AM on the 1st of every month: 0 4 1 * * command
- Execute every 5 minutes: */5 * * * * command
- Execute at 9 AM every weekday (Monday to Friday): 0 9 * * 1-5 command
crontab commands:
- crontab -e: edit current user's scheduled tasks
- crontab -l: list current user's scheduled tasks
- crontab -r: delete all scheduled tasks for current user
- crontab -u username -e: edit specified user's scheduled tasks (requires root privileges)
System-level scheduled tasks:
- /etc/crontab: system-level scheduled task configuration file
- /etc/cron.hourly/: directory for tasks executed every hour
- /etc/cron.daily/: directory for tasks executed every day
- /etc/cron.weekly/: directory for tasks executed every week
- /etc/cron.monthly/: directory for tasks executed every month
Environment variables:
- Environment variables when cron tasks execute are different from when user logs in
- Environment variables can be defined in crontab file
- It is recommended to use absolute paths in scripts
- Can source environment variable files at the beginning of scripts: source ~/.bashrc
Logs and debugging:
- cron log location: /var/log/syslog or /var/log/cron
- View logs: grep CRON /var/log/syslog
- Debugging tips: redirect output to log file: command >> /tmp/cron.log 2>&1
- Send email: cron sends output to user's mailbox by default
Best practices:
- Use absolute paths
- Set correct environment variables in scripts
- Add logging for easier debugging
- Use lock files to prevent duplicate execution
- Test scripts before adding to cron
- Set reasonable execution times to avoid system peak hours
- Regularly check cron task execution
Common problems:
- Insufficient script permissions: ensure script has execute permission (chmod +x script.sh)
- Environment variable issues: explicitly set environment variables in scripts
- Path issues: use absolute paths or switch to correct directory
- Timezone issues: ensure system timezone is correct
- cron service not started: systemctl status cron or systemctl start cron
anacron (asynchronous cron):
- Used for systems that don't run 24 hours
- Configuration file: /etc/anacrontab
- Suitable for devices like laptops that are not always on
- Checks last execution time and makes up if missed
systemd timers:
- systemd's scheduled task alternative
- Configuration files: /etc/systemd/system/*.timer
- View timers: systemctl list-timers
- More flexible scheduling options
- Better log integration