What is a cron job and how do you write a cron expression?
Cron has been a Unix staple since 1975 and remains the most common scheduling mechanism for server-side automation. On Linux and macOS, cron jobs are configured in a crontab file managed with the crontab -e command. Many modern platforms (AWS EventBridge, GitHub Actions, Vercel, Railway) implement the same cron expression syntax for their own schedulers, so the knowledge transfers broadly.
A standard cron expression has five space-separated fields: [minute] [hour] [day-of-month] [month] [day-of-week]. Each field accepts a specific value, a wildcard (*), a range (1-5), a step value (*/15 meaning every 15 units), or a comma-separated list (1,3,5). Some extended implementations add a sixth field for seconds.
Reading common expressions becomes intuitive quickly. * * * * * - runs every minute. 0 * * * * - runs at the top of every hour. 30 6 * * * - runs at 6:30 AM every day. 0 0 1 * * - runs at midnight on the first day of every month. 0 8-18 * * 1-5 - runs at the top of every hour from 8am to 6pm on weekdays only.
The most common pitfalls: cron uses the system timezone, which may differ from your application's timezone - always check or set TZ explicitly. Cron does not retry failed jobs; if a job fails silently, you will not know unless you implement logging or alerting. Jobs that run longer than their interval overlap unless you implement locking (flock on Linux, or application-level locks).
A cron expression generator lets you build and validate expressions visually, describing the schedule in plain English before committing the string to production configuration.