To set up cron jobs on a Linux server, choose the right user, open their crontab with crontab -e, add a schedule (minute hour day month weekday) and a full-path command, save, then verify with crontab -l. Check logs (/var/log/cron or /var/log/syslog) and use absolute paths, environment variables, and flock to avoid overlaps.
If you’re learning how to setup cron jobs on Linux server environments, this guide gives you a practical, copy‑paste friendly walkthrough. As a long-time server admin and Senior Technical SEO content writer at YouStable, I’ll show you the right syntax, real examples, troubleshooting tips, and best practices that actually work on production systems.
What Is Cron and Why Use It?

Cron is Linux’s built-in task scheduler. It runs a background daemon (cron/crond) that executes commands on a fixed schedule—backups, log rotation, script automation, and more. You edit a “crontab” (cron table) to define when and what should run.
Cron vs systemd Timers vs Anacron
- Cron: Precise schedules to the minute. Great for servers always online.
- systemd timers: Modern alternative with dependency control, on-boot delays, and better logging via
journalctl. - Anacron: Ensures daily/weekly/monthly jobs run even if the machine was off (common on laptops/Ubuntu servers for
/etc/cron.daily).
How Cron Works
The cron daemon reads user crontabs and system cron files, checks schedules every minute, and executes due commands using a minimal environment. On Debian/Ubuntu the service is cron; on RHEL/CentOS/Alma/Rocky it’s crond.
Cron Job Basics and Syntax
Crontab Time Fields
A user crontab line has five time fields followed by a command:
# ┌─ minute (0–59)
# │ ┌─ hour (0–23)
# │ │ ┌─ day of month (1–31)
# │ │ │ ┌─ month (1–12 or JAN–DEC)
# │ │ │ │ ┌─ day of week (0–7 or SUN–SAT; 0/7=Sunday)
# │ │ │ │ │
# * * * * * command-to-run
Use ranges (e.g., 1-5), lists (1,15,30), and steps (*/5 for every 5 units). In system files like /etc/crontab and /etc/cron.d/*, a sixth field (user) appears before the command.
Special Strings
@reboot /path/to/script.sh
@hourly /path/to/script.sh
@daily /path/to/script.sh
@weekly /path/to/script.sh
@monthly /path/to/script.sh
@yearly /path/to/script.sh
@annually /path/to/script.sh
User vs System Crontabs
- User crontab:
crontab -e(no user field; runs as that user) - System crontab:
/etc/crontab(includes a user field) - Drop-in files:
/etc/cron.d/(one job per line, includes user) - Periodic dirs:
/etc/cron.daily,weekly,monthlyrun viarun-parts
Environment Variables in Cron
PATH: Set a safe, explicit path.SHELL: Default is/bin/sh; set to/bin/bashif you need Bash features.MAILTO: Send output to an email; empty to suppress.CRON_TZ: On many distros, sets timezone per crontab.
# Example header in crontab
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=admin@example.com
# CRON_TZ=UTC
Step-by-Step: Setup Cron Jobs on Linux Server
1) Pick the Right Account
Run jobs under the least-privileged user that still has access to the files and commands needed. Use root only when required (e.g., system backups, package tasks).
2) Open Your Crontab
# Edit the crontab for the current user
crontab -e
# For another user (requires sudo)
sudo crontab -u www-data -e
Select your editor on first run. If needed, set it explicitly:
export EDITOR=vim
crontab -e
3) Add a Job
Add a line with a schedule and a full-path command. Redirect stdout/stderr to a log so you can debug.
# Every 5 minutes
*/5 * * * * /usr/bin/php /var/www/app/artisan schedule:run >> /var/log/app-cron.log 2>&1
# Run a backup at 02:30 daily
30 2 * * * /usr/bin/rsync -a --delete /data/ /backups/data/ >> /var/log/backup.log 2>&1
# At reboot, start a worker (with a small delay)
@reboot /bin/sleep 20 && /usr/bin/systemctl --user start queue-worker.service
4) Save and Verify
# List current crontab
crontab -l
# Validate cron service is running
# Debian/Ubuntu
systemctl status cron
# RHEL/CentOS/Alma/Rocky
systemctl status crond
5) Test and Check Logs
# Quick test: write timestamp every minute
* * * * * /usr/bin/date >> /tmp/cron-test.txt 2>&1
- Debian/Ubuntu logs:
/var/log/syslog(search for CRON) - RHEL family logs:
/var/log/cron - systemd journal:
journalctl -u cronorjournalctl -u crond
grep CRON /var/log/syslog
tail -f /var/log/cron
journalctl -u cron -f
Real-World Cron Examples You Can Copy
Avoid Overlaps with flock
# Every 10 minutes, run job if not already running
*/10 * * * * /usr/bin/flock -n /tmp/report.lock /usr/local/bin/generate_report.sh >> /var/log/report.log 2>&1
System-Wide Cron with a Specific User
Use /etc/cron.d/ to specify the user field explicitly.
# /etc/cron.d/db-backup
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# minute hour dom mon dow user command
15 3 * * * postgres /usr/bin/pg_dump -Fc mydb | /usr/bin/gzip -c > /backups/mydb-$(date +\%F).dump.gz 2>&1
Cron with run-parts (Daily Scripts)
Drop executable scripts in /etc/cron.daily/. Names must match run-parts rules (no dots).
# /etc/cron.daily/rotate-uploads (chmod +x)
/usr/sbin/tmpreaper 14d /var/www/uploads
Manage, List, Disable, and Remove Cron Jobs
List and Remove
crontab -l # list
crontab -r # remove current user's crontab
sudo crontab -u user -l
sudo crontab -u user -r
Temporarily Disable a Job
Comment it out and add context for future you:
# PAUSED 2025-02-01: heavy load during migration
# */2 * * * * /usr/local/bin/indexer.sh >> /var/log/indexer.log 2>&1
One-Off Timed Tasks
Use at or systemd-run –on-active for one-time jobs instead of cron:
echo "/usr/local/bin/once.sh" | at 02:00
systemd-run --on-active=5m /usr/local/bin/cache-warm.sh
Troubleshooting Cron Jobs
Check Logs and Command Output
- Redirect output to a file:
>> /var/log/myjob.log 2>&1 - Watch the service journal:
journalctl -u cron -forjournalctl -u crond -f - Ensure the job file loads (correct file name under
/etc/cron.d, no dots)
Fix Environment Differences
- Set
PATHexplicitly; cron has a minimal environment. - Use full paths to binaries (
/usr/bin/python3,/usr/bin/php). - Source virtualenvs or profiles inside scripts if needed.
- Use
SHELL=/bin/bashif you rely on Bash features.
Permissions and Allow/Deny
/etc/cron.allow: Whitelist users allowed to use cron./etc/cron.deny: Blacklist users.- Ensure executable and readable scripts; correct ownership for target files/dirs.
Cron Not Running?
- Service status:
systemctl status cronorsystemctl status crond - Enable on boot:
systemctl enable cronorsystemctl enable crond - SELinux/AppArmor may block actions—check audit logs.
Security and Best Practices
- Use absolute paths everywhere.
- Quote variables and paths; avoid word-splitting bugs.
- Least privilege: run under a non-root user when possible.
- Prevent overlaps with
flockor PID files. - Log outputs and rotate logs. Integrate with monitoring.
- Keep secrets in environment files or a vault, not inline.
- Wrap complex commands in version-controlled scripts.
- Validate backups with test restores; schedule integrity checks.
Cron on Popular Distros (Quick Notes)
- Debian/Ubuntu: Service is
cron; logs in/var/log/syslog./etc/cron.dailyoften driven by Anacron on servers. - RHEL/CentOS/Alma/Rocky: Service is
crond; logs in/var/log/cron. Package is usuallycronie. - SUSE/OpenSUSE: Similar to RHEL; verify with
systemctl status cron. - Containers: Consider a single supervisor (e.g.,
supervisord) or external schedulers; cron inside containers is possible but design carefully.
Key Takeaways
- Edit with
crontab -e, verify withcrontab -l, and monitor logs. - Use explicit paths, environment variables, and
flockto avoid overlaps. - Choose the right mechanism: cron, systemd timers, or Anacron.
- Harden security with least privilege and audited scripts.
- For peace of mind, consider YouStable’s managed servers to set up and monitor critical schedules.
FAQs: Cron Jobs on Linux Server
What is the correct cron syntax for every 5 minutes?
Use */5 * * * * followed by your command. Example: */5 * * * * /usr/bin/php /var/www/app/artisan schedule:run >> /var/log/app-cron.log 2>&1.
Why does my script work in the shell but not in cron?
Cron has a minimal environment. Set PATH, use full binary paths, specify SHELL=/bin/bash if using Bash features, source venvs, and redirect output to a log to capture errors.
Where can I find cron logs on Linux?
On Debian/Ubuntu, check /var/log/syslog for CRON entries. On RHEL/CentOS/Alma/Rocky, check /var/log/cron. Also review journalctl -u cron or journalctl -u crond.
How do I set a different timezone for a cron job?
Many distros support CRON_TZ per crontab. Example: CRON_TZ=UTC on the first line. Otherwise, set the system timezone or handle timezones inside your script.
How can I run a cron job as root or another user?
Use sudo crontab -e to edit root’s crontab. Or create a file in /etc/cron.d/ and include the username field. Ensure /etc/cron.allow/deny permit that user.