Two day fields: OR, with an important exception
0 9 1 * 1 means 09:00 on the 1st or any Monday. If a day is both, it runs once at that matching minute, not twice. Minute, hour and month must still all match.
Ubuntu/Vixie cron checks whether either day field starts with *. If so, both day tests must match. 0 9 */2 * 1 means Mondays on odd-numbered dates, not all Mondays plus odd dates.
1-31 covers all dates but is not syntactically a wildcard. Order matters: *,1 starts with *; 1,* does not. We preserve your syntax, never normalize it into a different day rule. Sunday is 0 or 7. Dates such as February 31 do not exist.
Percent signs are cron syntax, even in quotes
/usr/bin/date '+%F' is not safe as-is in a crontab. Write /usr/bin/date '+\%F' for a literal percent passed to the shell. Shell single or double quotes do not hide % from cron.
An unescaped % ends the shell command and sends the rest as standard input, converting later percent signs to newlines. With multiple backslashes, an odd number immediately before % escapes it; an even number does not. This app warns and requires acknowledgment for intentional unescaped percent syntax. It never rewrites it.
Paths, working directories & shell permissions
Cron is not your interactive terminal: no shell aliases, activated virtual environments or normal login profile. Use absolute command and interpreter paths. Jobs normally start in the account's home directory. For another directory, explicitly use cd /absolute/project && /absolute/script.
Choose the right shell. Ensure the account can read required files, traverse directories, execute scripts, and write logs. A directly executed script needs an executable bit and an appropriate shebang. Never put passwords or tokens in a crontab or public example; use a suitably protected configuration file. Command validation is not a shell correctness or security audit.
Output, failures & overlapping jobs
Output may be mailed only if a mail transport is configured. Do not assume you will receive errors. For a file log, append >> "$HOME/job.log" 2>&1 to a reviewed command. > truncates; >> appends. Keep logs private when needed, ensure write permission, and plan rotation.
Cron starts a new invocation even if the old one is still running. For a single-instance script, consider /usr/bin/flock -n "$HOME/.learning-job.lock" /absolute/script. Check that flock exists and the lock is in a private, writable directory. -n skips a busy invocation rather than queues it; handle/report failures in your script. A lock is not retry or recovery logic.
Timezone, DST & jobs missed while powered off
Baseline: Ubuntu 22.04 LTS (Jammy), Debian/Vixie-derived cron 3.0pl1-137ubuntu3 family. Check your host with dpkg-query -W cron and read its installed man 5 crontab / man 8 cron. Other Ubuntu releases or installed packages (such as Cronie) can differ.
Schedules use the daemon's configured system timezone. Check the host using timedatectl; the browser's timezone is not authoritative. In this baseline, TZ changes the command's environment, not its schedule. Do not assume CRON_TZ support.
Ubuntu cron treats clock changes under three hours specially: fixed-time jobs missed by a forward change run soon afterward; repeated fixed times after a backward change are not re-run. Wildcard minute/hour schedules follow the new time immediately. These syntactic distinctions matter — do not assume every cron package simply skips or duplicates every DST job. Larger corrections use the new time immediately. We deliberately provide no next-run/DST simulator.
Ordinary jobs missed while the host is off or cron is stopped are not automatically replayed. Anacron can catch up configured daily/weekly/monthly tasks, not arbitrary minute jobs. systemd timers offer dependency integration and optional persistent calendar timers; configure those intentionally for your needs.
@reboot is not a network-ready promise
@reboot is a cron startup hook handled by Ubuntu's daemon, not a fixed timestamp or an ordering contract. It may run before the network or another service is ready. It does not make your command a managed service, keep it alive, or retry a failure. Use a systemd service with explicit dependencies when readiness and lifecycle matter.
Other supported macros are calendar shortcuts: @hourly, @daily/@midnight, @weekly, @monthly, @yearly/@annually. They are not intervals measured from installation.