Ob Sie Serverwartung automatisieren, Datenpipelines planen oder CI/CD-Workflows auslosen - der Cron-Ausdruck ist die universelle Sprache der zeitbasierten Aufgabenplanung. Ein Cron-Ausdruck-Generator hilft beim visuellen Erstellen, wahrend ein Cron-Parser kryptische Zeichenketten in lesbare Beschreibungen ubersetzt. Dieser Leitfaden deckt alles ab, von der Cron-Syntax bis zu praktischen Beispielen in JavaScript, Python, Bash und Cloud-Plattformen.
Testen Sie unser kostenloses Online-Tool zum Generieren und Parsen von Cron-Ausdrucken.
Was ist ein Cron-Ausdruck?
Ein Cron-Ausdruck ist eine kompakte Zeichenkette zur Definition wiederkehrender Zeitplane. Der Name stammt vom griechischen chronos (Zeit) und dem Unix-cron-Daemon. Cron ist zum Standard fur Aufgabenplanung geworden.
Im klassischen Unix-Crontab-Format besteht ein Cron-Ausdruck aus funf Feldern: Minute Stunde Tag Monat Wochentag. Jedes Feld akzeptiert Zahlen, Platzhalter, Bereiche, Listen und Schritte.
Heute werden Cron-Ausdrucke in Kubernetes CronJobs, GitHub Actions, AWS EventBridge und Vercel Cron verwendet. Das Verstandnis der Cron-Syntax ist fur jeden Entwickler unerlasslich.
Cron-Ausdruck-Syntax erklart
Der Standard-Cron-Ausdruck verwendet funf Felder. Jedes Feld stellt eine Zeiteinheit dar:
| Feld | Werte | Sonderzeichen | Beschreibung |
|---|---|---|---|
| Minute | 0-59 | * , - / | Ausfuhrungsminute |
| Stunde | 0-23 | * , - / | Stunde (24h-Format) |
| Tag | 1-31 | * , - / ? L W | Tag des Monats |
| Monat | 1-12 | * , - / | Monat des Jahres |
| Wochentag | 0-7 | * , - / ? L # | Tag der Woche |
Sonderzeichen: * passt auf alle Werte. Komma , trennt Listen. Bindestrich - definiert Bereiche. Schragstrich / definiert Schritte (z.B. */5 = alle 5 Minuten).
Das Format ist: * * * * * (Minute Stunde Tag Monat Wochentag). Dieses Funf-Felder-Muster ist das Herzstuck jeder Cron-Zeitplan-Definition.
Cron-Ausdruck-Beispieltabelle
Hier sind die haufigsten Cron-Ausdruck-Beispiele aus Produktionssystemen:
| Cron-Ausdruck | Beschreibung |
|---|---|
* * * * * | Jede Minute |
*/5 * * * * | Alle 5 Minuten |
0 * * * * | Stundlich |
0 0 * * * | Taglich um Mitternacht |
0 9 * * 1-5 | Werktags um 9 Uhr |
0 0 1 * * | Erster Tag jedes Monats |
Codebeispiele fur Cron-Jobs
JavaScript / Node.js Cron-Jobs
Node.js bietet node-cron, cron, croner und Bree fur die Aufgabenplanung:
// ===== node-cron (most popular) =====
// npm install node-cron
const cron = require('node-cron');
// Run every 5 minutes
cron.schedule('*/5 * * * *', () => {
console.log('Running task every 5 minutes');
// Your task logic here
});
// Run weekdays at 9:00 AM
cron.schedule('0 9 * * 1-5', () => {
console.log('Good morning! Running weekday task.');
}, {
timezone: 'America/New_York'
});
// Validate a cron expression
console.log(cron.validate('*/5 * * * *')); // true
console.log(cron.validate('60 * * * *')); // false
// ===== cron npm package =====
// npm install cron
const { CronJob } = require('cron');
const job = new CronJob(
'0 */6 * * *', // every 6 hours
function () {
console.log('Running every 6 hours');
},
null, // onComplete
true, // start immediately
'America/Chicago' // timezone
);
// ===== croner (modern, zero-dependency) =====
// npm install croner
import { Cron } from 'croner';
// Run every minute
const task = new Cron('* * * * *', () => {
console.log('Tick every minute');
});
// Run at specific time, get next run
const next = task.nextRun();
console.log('Next execution:', next);
// Stop the job
task.stop();
// ===== Bree (worker-thread scheduler) =====
// npm install bree
const Bree = require('bree');
const bree = new Bree({
jobs: [
{
name: 'backup',
cron: '0 2 * * *', // daily at 2 AM
path: './jobs/backup.js'
},
{
name: 'cleanup',
cron: '0 0 * * 0', // weekly on Sunday
path: './jobs/cleanup.js'
}
]
});
bree.start();Python Cron-Planung
Python bietet schedule, APScheduler, python-crontab und Celery Beat:
# ===== schedule library (human-friendly) =====
# pip install schedule
import schedule
import time
def backup_database():
print("Backing up database...")
def send_report():
print("Sending daily report...")
schedule.every(5).minutes.do(backup_database)
schedule.every().day.at("09:00").do(send_report)
schedule.every().monday.at("08:30").do(send_report)
while True:
schedule.run_pending()
time.sleep(1)
# ===== APScheduler (enterprise-grade) =====
# pip install apscheduler
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
scheduler = BlockingScheduler()
# Using cron expression syntax
@scheduler.scheduled_job(CronTrigger.from_crontab('*/10 * * * *'))
def cleanup_temp_files():
print("Cleaning temp files every 10 minutes")
# Using keyword arguments
@scheduler.scheduled_job('cron', hour=9, minute=0, day_of_week='mon-fri')
def weekday_report():
print("Weekday report at 9:00 AM")
# First Monday of each month at 3 AM
@scheduler.scheduled_job('cron', day='1-7', day_of_week='mon', hour=3)
def monthly_audit():
print("Monthly audit")
scheduler.start()
# ===== python-crontab (manage system crontab) =====
# pip install python-crontab
from crontab import CronTab
cron = CronTab(user='myuser')
# Create a new cron job
job = cron.new(
command='/usr/bin/python3 /opt/app/backup.py >> /var/log/backup.log 2>&1'
)
job.setall('0 2 * * *') # Daily at 2 AM
job.set_comment('Nightly database backup')
job.enable()
# List all cron jobs
for job in cron:
print(f"{job.slices} -> {job.command}")
cron.write() # Save changes
# ===== Celery Beat (distributed scheduling) =====
# pip install celery
# celeryconfig.py
from celery.schedules import crontab
beat_schedule = {
'cleanup-every-hour': {
'task': 'tasks.cleanup',
'schedule': crontab(minute=0, hour='*/1'),
},
'weekly-report': {
'task': 'tasks.send_report',
'schedule': crontab(hour=9, minute=0, day_of_week=1),
},
}Bash / Linux Crontab-Befehle
Unter Linux/macOS: crontab -e zum Bearbeiten, crontab -l zum Auflisten:
# ===== Essential crontab commands =====
# Edit your user crontab
crontab -e
# List current cron jobs
crontab -l
# Remove all cron jobs (use with caution!)
crontab -r
# Edit another user's crontab (requires root)
sudo crontab -u www-data -e
# ===== Example crontab file =====
# Set environment variables at the top
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin
MAILTO=admin@example.com
TZ=UTC
# m h dom mon dow command
# Backup database every night at 2 AM
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# Run cleanup every 15 minutes with flock
*/15 * * * * flock -n /tmp/cleanup.lock /opt/scripts/cleanup.sh
# Send report on weekdays at 9 AM
0 9 * * 1-5 /opt/scripts/daily-report.sh 2>&1 | logger -t daily-report
# Rotate logs on the 1st of each month
0 0 1 * * /usr/sbin/logrotate /etc/logrotate.conf
# Health check every minute (ping monitoring service)
* * * * * curl -fsS --retry 3 https://hc-ping.com/your-uuid > /dev/null
# ===== System crontab (/etc/cron.d/) =====
# /etc/cron.d/myapp (includes username field)
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
# Note: system crontab includes a user field
*/5 * * * * www-data /opt/myapp/cron/process-queue.sh
0 3 * * * root /opt/myapp/cron/maintenance.sh
# ===== Logging best practices =====
# Log with timestamp
0 * * * * /opt/scripts/job.sh 2>&1 | while read line; do \
echo "$(date '+\%Y-\%m-\%d \%H:\%M:\%S') $line"; \
done >> /var/log/myjob.log
# MAILTO for error notifications
MAILTO=ops-team@example.com
# Only errors are emailed (stdout goes to log, stderr to email)
0 */6 * * * /opt/scripts/etl.sh >> /var/log/etl.logCloud & CI/CD Cron-Planung
Cron-Ausdrucke werden in GitHub Actions, AWS EventBridge, Kubernetes CronJob und Vercel Cron verwendet:
# ===== GitHub Actions scheduled workflow =====
# .github/workflows/scheduled.yml
name: Scheduled Tasks
on:
schedule:
# Run every day at 6 AM UTC
- cron: '0 6 * * *'
# Run every Monday at 9 AM UTC
- cron: '0 9 * * 1'
workflow_dispatch: # Allow manual trigger
jobs:
daily-task:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./scripts/daily-task.sh
---
# ===== AWS EventBridge (CloudWatch) cron =====
# Note: AWS cron has 6 fields (includes year)
# Format: minute hour day-of-month month day-of-week year
# Every 5 minutes
aws events put-rule \
--name "every-5-min" \
--schedule-expression "cron(*/5 * * * ? *)"
# Weekdays at 9 AM UTC
aws events put-rule \
--name "weekday-morning" \
--schedule-expression "cron(0 9 ? * MON-FRI *)"
# First day of each quarter
aws events put-rule \
--name "quarterly" \
--schedule-expression "cron(0 0 1 1,4,7,10 ? *)"
---
# ===== Kubernetes CronJob =====
# k8s-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: database-backup
spec:
schedule: "0 2 * * *" # Daily at 2 AM
timeZone: "America/New_York" # Available since k8s 1.27
concurrencyPolicy: Forbid # Prevent overlapping runs
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: myapp/backup:latest
command: ["/bin/sh", "-c", "./backup.sh"]
env:
- name: DB_HOST
valueFrom:
secretKeyRef:
name: db-credentials
key: host
restartPolicy: OnFailure
---
# ===== Vercel cron (vercel.json) =====
{
"crons": [
{
"path": "/api/cron/daily-cleanup",
"schedule": "0 0 * * *"
},
{
"path": "/api/cron/hourly-sync",
"schedule": "0 * * * *"
},
{
"path": "/api/cron/weekly-report",
"schedule": "0 9 * * 1"
}
]
}Erweiterte Cron-Funktionen
Viele Implementierungen erweitern die Syntax um ein Sekundenfeld (6 Felder) und ein Jahresfeld (7 Felder). Quartz, node-cron und Spring Framework unterstutzen diese erweiterten Formate.
Erweiterte Sonderzeichen: L = letzter, W = nachster Werktag, # = N-tes Vorkommen eines Wochentags.
Nicht-standardmasige Kurzformen: @reboot, @yearly, @monthly, @weekly, @daily, @hourly.
Cron-Job-Debugging und Uberwachung
Zeitzonen-Probleme: Setzen Sie immer TZ=UTC in Ihrer Crontab.
PATH-Probleme: Der Cron-Daemon verwendet eine minimale Umgebung. Verwenden Sie absolute Pfade.
Ausgabe nicht erfasst: Leiten Sie stdout und stderr immer in eine Log-Datei um.
Uberlappende Ausfuhrungen: Verwenden Sie flock zur Vermeidung.
Cron-Job Best Practices
Beschreibende Kommentare: Dokumentieren Sie jeden Crontab-Eintrag.
Ausgabeumleitung und Logging: In dedizierte Log-Dateien umleiten.
Gegenseitiger Ausschluss mit flock: Uberlappungen verhindern.
SHELL und PATH setzen: Umgebung explizit deklarieren.
Absolute Pfade: Uberall absolute Pfade verwenden.
Uberwachungsdienste: healthchecks.io oder Cronitor verwenden.
Zeitzonen-Bewusstsein: UTC verwenden und dokumentieren.
Haufig gestellte Fragen
Was bedeuten die funf Felder eines Cron-Ausdrucks?
Die funf Felder sind: Minute (0-59), Stunde (0-23), Tag des Monats (1-31), Monat (1-12), Wochentag (0-7). Jedes Feld akzeptiert Werte, Platzhalter (*), Bereiche, Listen und Schritte.
Was ist der Unterschied zwischen Cron und systemd Timern?
Cron ist der traditionelle Unix-Planer. Systemd Timer sind die moderne Alternative unter Linux: sie unterstutzen Ereignisse, behandeln verpasste Ausfuhrungen und integrieren sich in journalctl. Cron bleibt der Standard in der Cloud.
Wie fuhre ich einen Cron-Job alle N Minuten aus?
Verwenden Sie die Schritt-Syntax */N im Minutenfeld. Beispiele: alle 5 Minuten = "*/5 * * * *", alle 15 Minuten = "*/15 * * * *". Der Schrittwert sollte 60 teilen.
Verwandte Leitfaden:
- Cron-Ausdruck-Beispiele: Gangige Muster
- Cron-Planung in Serverless: GitHub Actions, Vercel & Cloudflare
Das Beherrschen von Cron-Ausdrucken ist fur jeden Entwickler unerlasslich. Nutzen Sie unser kostenloses Tool zum Generieren und Parsen.
Generieren und parsen Sie Cron-Ausdrucke mit unserem kostenlosen Tool.