Automate Your Workflows Using Cmdtime — Examples and Scripts
Date: February 8, 2026
Cmdtime is a lightweight command-line utility designed to simplify time-based automation and workflow measurement. This article shows practical examples and ready-to-use scripts to help you integrate Cmdtime into build scripts, CI/CD pipelines, task scheduling, and developer tooling.
What Cmdtime does (brief)
- Measure: capture execution time for commands or scripts.
- Schedule: run commands at specific times or intervals.
- Log: generate structured timestamps and duration logs for later analysis.
- Trigger: run follow-up commands based on timing outcomes (e.g., long-running jobs).
Installation
Assume a typical install via package manager or download. Example (Linux/macOS with Homebrew-style):
bash
brew install cmdtime # or curl -sSL https://example.com/cmdtime/install.sh | bash
Basic usage examples
- Measure a single command:
bash
cmdtime run – echo “Hello, world!” # outputs start time, end time, duration, exit code
- Time a pipeline:
bash
cmdtime run – bash -lc ‘grep -R “TODO” src | wc -l’
- Schedule a command once at a specified time:
bash
cmdtime schedule –at “2026-02-09 02:30” – bash -lc ‘backup.sh’
- Run a command every N minutes:
bash
cmdtime schedule –every 15m – bash -lc ‘sync-data.sh’
Example 1 — CI job timing and conditional step
Use Cmdtime to fail a step if it exceeds a threshold, preventing slow builds from progressing.
script: .gitlab-ci.yml snippet
yaml
stages: - test test: stage: test script: - > cmdtime run –format json – bash -lc ‘ timeout 10m npm test ’ > test-time.json || true - > DURATION=\((jq .duration_ms test-time.json) </span><span class="token scalar" style="color: rgb(163, 21, 21);"> if [ "\)DURATION” -gt 600000 ]; then echo “Tests exceeded 10 minutes (\(DURATION ms) — failing pipeline" </span><span class="token scalar" style="color: rgb(163, 21, 21);"> exit 1 </span><span class="token scalar" style="color: rgb(163, 21, 21);"> fi</span><span> </span></code></div></div></pre> <h3>Example 2 — Scheduled nightly backup with logging and rotation</h3> <p>Nightly backup script: backup-nightly.sh</p> <pre><div class="XG2rBS5V967VhGTCEN1k"><div class="nHykNMmtaaTJMjgzStID"><div class="HsT0RHFbNELC00WicOi8"><i><svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M15.434 7.51c.137.137.212.311.212.49a.694.694 0 0 1-.212.5l-3.54 3.5a.893.893 0 0 1-.277.18 1.024 1.024 0 0 1-.684.038.945.945 0 0 1-.302-.148.787.787 0 0 1-.213-.234.652.652 0 0 1-.045-.58.74.74 0 0 1 .175-.256l3.045-3-3.045-3a.69.69 0 0 1-.22-.55.723.723 0 0 1 .303-.52 1 1 0 0 1 .648-.186.962.962 0 0 1 .614.256l3.541 3.51Zm-12.281 0A.695.695 0 0 0 2.94 8a.694.694 0 0 0 .213.5l3.54 3.5a.893.893 0 0 0 .277.18 1.024 1.024 0 0 0 .684.038.945.945 0 0 0 .302-.148.788.788 0 0 0 .213-.234.651.651 0 0 0 .045-.58.74.74 0 0 0-.175-.256L4.994 8l3.045-3a.69.69 0 0 0 .22-.55.723.723 0 0 0-.303-.52 1 1 0 0 0-.648-.186.962.962 0 0 0-.615.256l-3.54 3.51Z"></path></svg></i><p class="li3asHIMe05JPmtJCytG wZ4JdaHxSAhGy1HoNVja cPy9QU4brI7VQXFNPEvF">bash</p></div><div class="CF2lgtGWtYUYmTULoX44"><button type="button" class="st68fcLUUT0dNcuLLB2_ ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ CPXAhl7VTkj2dHDyAYAf" data-copycode="true" role="button" aria-label="Copy Code"><svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M9.975 1h.09a3.2 3.2 0 0 1 3.202 3.201v1.924a.754.754 0 0 1-.017.16l1.23 1.353A2 2 0 0 1 15 8.983V14a2 2 0 0 1-2 2H8a2 2 0 0 1-1.733-1H4.183a3.201 3.201 0 0 1-3.2-3.201V4.201a3.2 3.2 0 0 1 3.04-3.197A1.25 1.25 0 0 1 5.25 0h3.5c.604 0 1.109.43 1.225 1ZM4.249 2.5h-.066a1.7 1.7 0 0 0-1.7 1.701v7.598c0 .94.761 1.701 1.7 1.701H6V7a2 2 0 0 1 2-2h3.197c.195 0 .387.028.57.083v-.882A1.7 1.7 0 0 0 10.066 2.5H9.75c-.228.304-.591.5-1 .5h-3.5c-.41 0-.772-.196-1-.5ZM5 1.75v-.5A.25.25 0 0 1 5.25 1h3.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-3.5A.25.25 0 0 1 5 1.75ZM7.5 7a.5.5 0 0 1 .5-.5h3V9a1 1 0 0 0 1 1h1.5v4a.5.5 0 0 1-.5.5H8a.5.5 0 0 1-.5-.5V7Zm6 2v-.017a.5.5 0 0 0-.13-.336L12 7.14V9h1.5Z"></path></svg>Copy Code</button><button type="button" class="st68fcLUUT0dNcuLLB2_ WtfzoAXPoZC2mMqcexgL ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ GnLX_jUB3Jn3idluie7R"><svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" d="M20.618 4.214a1 1 0 0 1 .168 1.404l-11 14a1 1 0 0 1-1.554.022l-5-6a1 1 0 0 1 1.536-1.28l4.21 5.05L19.213 4.382a1 1 0 0 1 1.404-.168Z" clip-rule="evenodd"></path></svg>Copied</button></div></div><div class="mtDfw7oSa1WexjXyzs9y" style="color: var(--sds-color-text-01); font-family: var(--sds-font-family-monospace); direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: var(--sds-font-size-label); line-height: 1.2em; tab-size: 4; hyphens: none; padding: var(--sds-space-x02, 8px) var(--sds-space-x04, 16px) var(--sds-space-x04, 16px); margin: 0px; overflow: auto; border: none; background: transparent;"><code class="language-bash" style="color: rgb(57, 58, 52); font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: 0.9em; line-height: 1.2em; tab-size: 4; hyphens: none;"><span class="token shebang" style="color: rgb(238, 153, 0); font-weight: bold;">#!/usr/bin/env bash</span><span> </span><span></span><span class="token builtin" style="color: rgb(43, 145, 175);">set</span><span> -euo pipefail </span> <span></span><span class="token assign-left" style="color: rgb(54, 172, 170);">LOG_DIR</span><span class="token" style="color: rgb(57, 58, 52);">=</span><span class="token" style="color: rgb(163, 21, 21);">"/var/log/cmdtime-backups"</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">mkdir</span><span> -p </span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(54, 172, 170);">\)LOG_DIR” TIMESTAMP=\((</span><span class="token" style="color: rgb(57, 58, 52);">date</span><span class="token" style="color: rgb(54, 172, 170);"> -u +</span><span class="token" style="color: rgb(163, 21, 21);">"%Y%m%dT%H%M%SZ"</span><span class="token" style="color: rgb(54, 172, 170);">)</span><span> </span><span></span><span class="token assign-left" style="color: rgb(54, 172, 170);">LOGFILE</span><span class="token" style="color: rgb(57, 58, 52);">=</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(54, 172, 170);">\)LOG_DIR/backup-\(TIMESTAMP</span><span class="token" style="color: rgb(163, 21, 21);">.json"</span><span> </span> <span>cmdtime run --format json -- </span><span class="token" style="color: rgb(57, 58, 52);">bash</span><span> -lc </span><span class="token" style="color: rgb(163, 21, 21);">' </span><span class="token" style="color: rgb(163, 21, 21);"> tar -czf /backups/site-\)TIMESTAMP.tar.gz /var/www/html ‘ > “\(LOGFILE</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> </span> <span></span><span class="token" style="color: rgb(0, 128, 0); font-style: italic;"># Keep last 30 logs</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">ls</span><span> -1t </span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(54, 172, 170);">\)LOGDIR”/backup-*.json | tail -n +31 | xargs -r rm –
Schedule with system cron or cmdtime scheduler:
bash
cmdtime schedule –every 24h –at “02:00” – /usr/local/bin/backup-nightly.sh
Example 3 — Developer hotfix: track slow database migrations
One-off wrapper to measure migration steps and produce a CSV for analysis.
measure-migrations.sh
bash
#!/usr/bin/env bash echo “migration,started_at,ended_at,durationms” > migrations.csv for f in migrations/*.sql; do NAME=\((</span><span class="token" style="color: rgb(57, 58, 52);">basename</span><span class="token" style="color: rgb(54, 172, 170);"> </span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(163, 21, 21);">\)f“) cmdtime run –format csv –label ”\(NAME</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> -- </span><span class="token" style="color: rgb(57, 58, 52);">bash</span><span> -lc </span><span class="token" style="color: rgb(163, 21, 21);">"psql -f </span><span class="token" style="color: rgb(54, 172, 170);">\)f“ >> migrations.csv done
Advanced: chaining and conditional triggers
Trigger a cleanup only when a job completes under a threshold.
bash
cmdtime run –format json – bash -lc ‘long-job.sh’ > job.json DURATION=\((</span><span class="token" style="color: rgb(54, 172, 170);">jq .duration_ms job.json</span><span class="token" style="color: rgb(54, 172, 170);">)</span><span> </span><span></span><span class="token" style="color: rgb(0, 0, 255);">if</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">[</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(54, 172, 170);">\)DURATION“ -lt 300000 ]; then cmdtime run – bash -lc ‘cleanup-temp.sh’ else echo “Job too slow; skip cleanup” fi
Integrating with observability
- Emit JSON logs from cmdtime and ingest into your logging system (Fluentd, Logstash).
- Use the duration field for alerting: create alerts for unusually long durations.
Tips and best practices
- Format: prefer JSON for machine parsing in CI and observability.
- Labels: use meaningful labels (–label) for grouping events.
- Thresholds: enforce duration thresholds in pipelines to maintain performance SLAs.
- Rotation: rotate cmdtime logs to avoid disk growth.
- Security: run scheduled commands under least-privilege users and sanitize inputs.
Troubleshooting
- If schedules fail, check system timezone and cmdtime daemon status.
- For inaccurate durations, ensure system clock (NTP) is synchronized.
- If output parsing fails, verify –format option and escaping in shells.
Conclusion
Cmdtime is a flexible tool for measuring and scheduling command execution. Use it to enforce performance budgets, automate routine tasks, and gather timing telemetry for observability. The examples above are ready to drop into CI, cron replacements, or developer scripts—adapt labels, formats, and thresholds to match your environment.
Leave a Reply