Cron Job Helper — Manual

Complete walkthrough of the Cron Job Helper: cron syntax, the visual builder, presets, plain-text preview, web cron generator, CMS recipes and Docker/DDEV.

Back to the overview: Cron Job Helper · Open the live tool: www.jpkc.com/tools/cron/

This manual describes the Cron Job Helper in full: the cron syntax it understands, each of the five tabs, and the commands they produce. The interface is in English, so the tab and field labels below are quoted as they appear in the tool.

Cron syntax: five fields

A classic cron expression consists of five space-separated fields followed by the command to run. The tool shows this as a diagram in the Reference tab:

┌─────────── minute (0–59)
│ ┌───────── hour (0–23)
│ │ ┌─────── day of month (1–31)
│ │ │ ┌───── month (1–12)
│ │ │ │ ┌─── day of week (0–6, Sun=0)
│ │ │ │ │
* * * * *  command to execute

The allowed values and special characters per field:

Field Values Special chars
Minute 0–59 * , - /
Hour 0–23 * , - /
Day of Month 1–31 * , - / ? L W
Month 1–12 or JAN–DEC * , - /
Day of Week 0–6 or SUN–SAT * , - / ? L #

For the day of week, Sunday = 0. Some cron implementations also accept 7 for Sunday and the three-letter names (SUN, MON, …); the Manual Input field also accepts names such as sun.

The special characters

The tool distinguishes the standard Vixie-cron characters from the extended Quartz characters (?, L, W, #), which the Reference tab explicitly marks as Quartz — they work in Java/Quartz schedulers but not in plain Unix cron:

Char Meaning Example
* any value * * * * * → every minute
, value list 0,15,30,45 → at minute :00 :15 :30 :45
- range 1-5 (day of week) → Mon–Fri
/ step / interval */5 → every 5 units
? no specific value (Quartz) 0 12 ? * MON
L last (Quartz) L in day-of-month → last day
W nearest weekday (Quartz) 15W → nearest weekday to the 15th
# nth weekday (Quartz) 5#3 → 3rd Friday

Special strings

Instead of five fields, cron also accepts @ shortcuts. The tool recognises them in Manual Input and expands them:

String Equivalent Meaning
@reboot once at system startup
@yearly / @annually 0 0 1 1 * once a year, January 1st
@monthly 0 0 1 * * once a month, on the 1st at midnight
@weekly 0 0 * * 0 once a week, Sunday midnight
@daily / @midnight 0 0 * * * once a day at midnight
@hourly 0 * * * * once an hour

@reboot has no calculable schedule — so the Next Scheduled Runs show no times, just a note that the job only runs at system startup.

Tab 1 — Builder

The Builder is the heart of the tool. At the top sits the Cron Expression: the current expression (default * * * * *), the field labels below it, and a plain-text description of what the expression does. A Copy button copies the expression to the clipboard.

The field cards

Below that, each of the five fields gets a card (Minute, Hour, Day of Month, Month, Day of Week) with a dropdown for the mode:

  • Every <field> — every value (*).
  • Every N <field>s (*/N) — step: a number input appears, producing */N.
  • Specific value — a fixed single value; a number input within the field's allowed range.
  • Range (A–B) — a range; two From/to inputs produce A-B.
  • List (A,B,C) — a comma-separated list, e.g. 0,15,30,45.

Any change instantly updates the expression above, the plain-text description and the list of next runs.

Manual Input

Prefer typing the expression? Use the Manual Input field. It accepts five space-separated fields (e.g. */5 * * * *) or a special string (@daily). If the input is invalid (fewer than five fields), a red error appears. A valid input syncs the field cards back, so the builder and the text input always show the same state.

Quick Presets

On the right sit 16 Quick Presets as buttons that set an expression with one click:

Every minute (* * * * *), Every 5 min (*/5 * * * *), Every 15 min (*/15 * * * *), Every 30 min (*/30 * * * *), Every hour (0 * * * *), Every 2 hours (0 */2 * * *), Every 6 hours (0 */6 * * *), Every 12 hours (0 */12 * * *), Daily midnight (0 0 * * *), Daily 3 AM (0 3 * * *), Weekly (Sun) (0 0 * * 0), Weekly (Mon) (0 0 * * 1), Monthly 1st (0 0 1 * *), Yearly Jan 1st (0 0 1 1 *), Weekdays 9 AM (0 9 * * 1-5) and Weekends (0 0 * * 6,0).

Next Scheduled Runs

Also on the right, the tool computes the next run times (up to eight) from the current expression — with date, time and a relative label (in 5 min, in 2h, in 3d …). It looks up to one year ahead; if it finds no match in that window, it says so. This preview is a client-side estimate based on the browser clock (local time zone), not a server run — see the Tips on the time-zone question.

Tab 2 — Web Cron

The Web Cron tab builds a cron job that calls a URL over HTTP instead of running a local script — handy for shared hosting or CMS tasks. You configure on the left; on the right, two outputs update live: the Generated Crontab Line (full line with schedule) and Command only (just the command).

The configuration fields:

  • Toolcurl (recommended) or wget.
  • URL to call — the address to request.
  • Cron schedule — the schedule (default */15 * * * *); build it in the Builder and paste it here.
  • Timeout (sec) — default 30, range 5–300. Becomes --max-time (curl) or --timeout= (wget).
  • HTTP MethodGET or POST (POST-X POST).
  • Log file path (optional) — appends >> "file" 2>&1.
  • User-Agent (optional) — -A (curl) or --user-agent= (wget).
  • HTTP Auth User / Pass (optional) — -u "user:pass" (curl) or --user/--password (wget).
  • Silent mode (on by default) — suppresses output (-s for curl, -q for wget). With silent off, curl additionally appends -w "%{http_code}" to print the HTTP status.
  • Skip SSL verification-k (curl) or --no-check-certificate (wget); for testing only.

A typical generated curl line looks like this:

*/15 * * * *  curl -s --max-time 30 -o /dev/null "https://example.com/cron/run" > /dev/null 2>&1

The tab also has a Web Cron Tips block with six pointers — among them: always use -s with curl on shared hosting (otherwise cron emails the full response on every run), redirect output to a log file, protect the URL with a token/IP restriction/basic auth, set a timeout, check the HTTP status, and always use HTTPS.

Tab 3 — CMS & Frameworks

Here the tool offers ready-made crontab recipes for five systems, each with a copy button. The message everywhere: replace or trigger the built-in or pseudo-scheduled scheduler with a real system cron.

WordPress

WordPress uses WP-Cron, which fires on page loads — unreliable on low-traffic sites. Recommendation: disable WP-Cron in wp-config.php via define( 'DISABLE_WP_CRON', true ); and replace it with a real cron, ideally via WP-CLI (wp cron event run --due-now …), alternatively via curl on wp-cron.php.

TYPO3

TYPO3 uses the Scheduler extension, which a real cron must trigger. The recommended path is the TYPO3 CLI (vendor/bin/typo3 scheduler:run, v10+); for older versions, the eID method via curl. The tool warns that the eID method is deprecated and removed in v12.

Drupal

Drupal uses cron hooks (hook_cron()), triggered via Drush (vendor/bin/drush cron) or via curl with the cron key (from Administration → Configuration → System → Cron). The tool recommends disabling the built-in Automated Cron module for full control.

Laravel

Laravel's Task Scheduler needs only one crontab line (php artisan schedule:run, every minute) — all tasks are defined in code (app/Console/Kernel.php, or routes/console.php from v9). The tab shows example task definitions and the foreground mode schedule:work.

Symfony

Symfony uses Console Commands, one crontab line per command (bin/console …). From Symfony 6.3 there is the Scheduler component, driven by a worker (messenger:consume scheduler_default). The tool's note: always add --no-ansi and --no-interaction when running from cron.

General Best Practices

A dedicated block collects seven general rules: use absolute paths (cron has a minimal $PATH, so /usr/bin/php instead of php); specify the user in /etc/crontab or /etc/cron.d/; redirect output (>> /var/log/cron.log 2>&1 or /dev/null); lock against overlap (flock); test the command manually as the cron user first; prefer cron.d over crontab (file-based, version-controllable); and mind the time zone (CRON_TZ=Europe/Berlin at the top of the crontab).

Tab 4 — Docker / DDEV

This tab collects patterns for cron in containers.

Docker & Podman

Three approaches plus Podman:

  • Option 1 — cron inside the container: install a cron daemon in the Dockerfile (e.g. dcron on Alpine), copy in the crontab file and start crond in the entrypoint. Tip: write output to /proc/1/fd/1 so it shows up in the Docker stdout log.
  • Option 2 — dedicated cron container: in Docker Compose, a separate service with the same image/volume and command: ["crond", "-f", "-l", "2"].
  • Option 3 — docker exec from the host: the host crontab calls docker exec -t my_app … into the running container.
  • Podman (rootless): the same via podman exec; plus loginctl enable-linger $USER so user services and cron survive logout.

DDEV

Three DDEV variants plus CMS examples:

  • Option 1 — host cron + ddev exec: only works while the project is running (ddev start) — the tool suggests a ddev describe | grep running check.
  • Option 2 — custom DDEV service (recommended): .ddev/docker-compose.cron.yaml with a loop container (while true; … sleep 60).
  • Option 3 — DDEV hook (post-start): a post-start hook in .ddev/config.yaml; simple, but the process ends on container restart.
  • Plus ready-made lines for WordPress in DDEV (ddev wp cron event run --due-now) and TYPO3 in DDEV (ddev typo3 scheduler:run).

A Container Cron Tips block adds: avoid cron inside the container where possible (prefer the dedicated container), log to stdout, set the time zone (TZ=Europe/Berlin, otherwise UTC), use health checks, and use the same scheduler approach locally (DDEV) and in production.

Tab 5 — Reference

A pure cheat sheet, usable any time without input: the syntax diagram shown above, the field and special-character tables, the special-string table, a Common Examples table, Useful Commands (crontab -e, crontab -l, crontab -r, crontab -u www-data -e, ls /etc/cron.d/, systemctl status cron, grep CRON /var/log/syslog, run-parts /etc/cron.hourly) and the MAILTO section.

MAILTO — email notifications

By default, cron emails any output (stdout/stderr) of a job to the local system user. The MAILTO variable at the top of the crontab controls this:

Setting Effect
MAILTO="" disables all cron emails globally
MAILTO="admin@example.com" sends output to an address
MAILTO="root" sends to local root (default)

The tool contrasts the two mechanisms: MAILTO="" suppresses email globally for the whole crontab, while > /dev/null 2>&1 suppresses output per command and also prevents a process from blocking on a full mail queue. For web cron jobs, combining both is the most robust.


For the audiences and the big picture, see the overview. Concrete expressions are in the examples, the classic pitfalls in the tips & tricks. Try it all directly in the tool.