The cron expression * * * * * runs a job every minute, 1440 times per day. Covers when per-minute cron makes sense and how to prevent overlapping runs.
⏰Every minute
*Any value,List separator-Range/Step1-5Range 1 through 5*/15Every 15 unitsThe cron expression * * * * * fires at every minute mark: 00:00, 00:01, 00:02, and so on, totaling 60 times per hour, 1440 times per day. A bare * in any cron field means “every valid value in this field.” With all five fields set to *, there is no filter: the job runs on every possible schedule boundary.
This is the maximum frequency cron supports. The minute field is the finest granularity cron has, so * * * * * is as fast as cron gets.
Some systems use cron to kick off a worker that drains a job queue. If jobs arrive continuously and latency matters, a per minute trigger ensures the queue does not sit idle for long. That said, a proper message queue with a long polling consumer is a cleaner architecture for this pattern.
If you cannot install a persistent monitoring agent, a per minute cron that checks a health endpoint or logs a metric is a pragmatic fallback. It will not catch failures that occur and recover within 60 seconds, but it is better than polling every 5 minutes for a critical service.
Writing a timestamp to a file or database every minute is a common liveness check. Some dead man’s switch implementations depend on this. If the heartbeat stops updating, an alert fires.
If you are generating reports, syncing data, or sending notifications, ask whether users actually need updates every minute. Most “near real time” requirements are satisfied by a 5 minute interval. Per minute cron is often chosen by default and never revisited.
If your job connects to a database, loads configuration from a remote source, or authenticates against an external API, it pays that cost 1440 times a day. A long running daemon pays it once.
Standard cron does not know whether the previous run is still executing. If the job takes 90 seconds, you will have two instances running simultaneously at minute 2. This leads to race conditions, duplicate work, and resource contention.
For any per minute cron job, test what happens when execution time exceeds 60 seconds. The standard fix is flock:
* * * * * flock -n /tmp/myjob.lock /path/to/myjob.sh
flock -n acquires an exclusive lock on the file. If a previous invocation still holds the lock, the new one exits immediately. This prevents overlap without killing the running job.
Alternatively, use a PID file check in your script, or a dedicated tool like run-one on Debian based systems:
* * * * * run-one /path/to/myjob.sh
If one minute is too slow, these are the real options:
Create a .service unit that loops internally and a .timer unit that starts it on boot. The service runs while true; do /path/to/task; sleep 10; done. You get subminute execution with proper restart behavior and journal logging.
Two crontab lines:
* * * * * /path/to/job
* * * * * sleep 30 && /path/to/job
This approximates a 30 second interval. It is fragile under load but works for low stakes tasks.
Application level schedulers run inside your process and support arbitrary intervals including subsecond. If you are already running a Python or Node.js service, these are preferable to cron for high frequency tasks.
Kubernetes CronJobs have the same 1 minute minimum as system cron. For subminute workloads in Kubernetes, use a Deployment with a loop in the container, not a CronJob.
With * * * * * active, you should see 60 log entries per hour. Verify on Linux:
grep CRON /var/log/syslog | grep myjob | tail -5
Or with systemd:
journalctl -u cron --since "1 hour ago" | grep myjob
If you see gaps in the per minute cadence, investigate: load average, disk I/O wait, or a lock contention issue from overlapping runs.
Nothing you paste leaves this tab. Every tool runs entirely in your browser — no upload, no server, no account.