A Python3 script for checking syntax and correctness of crontab files
Project description
Checkcrontab - check syntax in crontab files
A Python script for checking syntax of crontab files. Cross-platform support for Linux, macOS, and Windows.
English | Español | Português | Français | Deutsch | Italiano | Русский | 中文 | 日本語 | हिन्दी
Requirements
- Python 3.7 or higher
- Linux: Linux system with systemctl (for daemon checks), read access to
/etc/crontab - macOS: Unix system with read access to
/etc/crontab(systemctl not available) - Windows: No additional requirements (file-based validation only)
Platform Support
Linux (Full Support):
- ✅ System crontab validation (
/etc/crontab) - ✅ User crontab validation (via
crontab -l -u username) - ✅ User existence validation
- ✅ Daemon/service checks via systemctl
- ✅ All crontab syntax features
- ✅ File permissions validation
- ✅ Cron daemon status checks
macOS (Partial Support):
- ✅ System crontab validation (
/etc/crontab) - ✅ User crontab validation (via
crontab -l -u username) - ✅ User existence validation
- ❌ Daemon/service checks (systemctl not available)
- ✅ All crontab syntax features
- ✅ File permissions validation
- ❌ Cron daemon status checks
Windows (Limited Support):
- ✅ File-based crontab syntax validation
- ❌ User existence checks (no user management integration)
- ❌ System crontab access (no
/etc/crontab) - ❌ Daemon/service checks (no systemctl)
- ✅ All crontab syntax features supported
- ❌ File permissions validation (no Unix permissions)
- ❌ Cron daemon status checks (no cron daemon)
Installation
pip3 install checkcrontab
Or from GitHub:
pip3 install git+https://github.com/wachawo/checkcrontab.git
Usage
# Check system crontab (Linux/macOS only)
checkcrontab
# Check crontab file
checkcrontab /etc/crontab
# Check user crontab (Linux/macOS only)
checkcrontab username
# Check with explicit type flags
checkcrontab -S system.cron -U user.cron -u username1 -u username2
# Check crontab directory
checkcrontab /etc/cron.d
# Show help
checkcrontab --help
# Show version
checkcrontab --version
Platform-specific behavior:
- Linux: Full functionality including daemon checks and user validation
- macOS: Full functionality except daemon checks (systemctl not available)
- Windows: File-based validation only, no system integration
TEXT Output
To redirect output from STDERR to STDOUT (for example, in CI), use --format text:
checkcrontab --format text examples/user_valid.txt
SARIF Output
For SARIF output, use the --format sarif flag:
checkcrontab --format sarif examples/user_valid.txt
JSON Output
For machine-readable output, use the --format json flag:
checkcrontab --format json examples/user_valid.txt
Example JSON output:
{
"success": true,
"total_files": 2,
"total_rows": 27,
"total_rows_errors": 0,
"total_errors": 0,
"files": [
{
"file": "/etc/crontab",
"is_system_crontab": true,
"rows": 5,
"rows_errors": 0,
"errors_count": 0,
"errors": [],
"success": true
},
{
"file": "examples/user_valid.txt",
"is_system_crontab": false,
"rows": 22,
"rows_errors": 0,
"errors_count": 0,
"errors": [],
"success": true
}
]
}
Exit codes
| Code | Meaning |
|---|---|
| 0 | No errors (warnings allowed). With --exit-zero always 0. |
| 1 | Findings present: any error, or any warning when --strict is set. |
| 2 | Runtime/usage error (unexpected failure, bad CLI args, etc.). |
Command Line Options
-S, --system- System crontab files-U, --user- User crontab files-u, --username- Usernames to check-v, --version- Show version-d, --debug- Debug output-n, --no-colors- Disable colored output--format {text,json,sarif}- Output format--strict- Treat warnings as errors--exit-zero- Always return exit code 0
Features
- Cross-platform syntax validation (Linux, macOS, Windows)
- Platform-specific features:
- Linux/macOS: System and user crontab validation, user existence checks, daemon validation
- Windows: File-based validation only
- Time field validation (minutes, hours, days, months, weekdays)
- Dangerous command detection
- Special keyword support (@reboot, @daily, etc.)
- Multi-line command support
Features Documentation - Comprehensive guide to supported syntax, valid values, examples, and error messages.
Development Tools
pip3 install pre-commit flake8 pytest mypy ruff
pre-commit install
pre-commit run --all-files
pre-commit autoupdate
Testing
pytest --cov=checkcrontab --cov-report=term-missing
coverage html # optional local HTML report in htmlcov/index.html
# CI automatically uploads coverage.xml to Codecov
# python -m coverage_badge -o docs/coverage.svg
Usage with pre-commit
You can use checkcrontab as a pre-commit hook in your projects:
- Add to your
.pre-commit-config.yaml:
repos:
- repo: https://github.com/wachawo/checkcrontab
rev: 0.0.8 # Use the latest version
hooks:
- id: checkcrontab
files: \.(cron|crontab|tab|conf)$
exclude: (\.git|node_modules|__pycache__)/
args: [--format, json, --strict]
- Install pre-commit:
pip install pre-commit
pre-commit install
- The hook will automatically check all
.cron,.crontab, and.tabfiles in your repository.
License
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file checkcrontab-0.0.12.tar.gz.
File metadata
- Download URL: checkcrontab-0.0.12.tar.gz
- Upload date:
- Size: 34.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac11d55e7db1620e2086f2869602f973b452ffd223670eae017e4da7d1c738d0
|
|
| MD5 |
ce1d72f544350fce7227fcb7eea90dd0
|
|
| BLAKE2b-256 |
789e6c771e26bf6aee32046ab546fcdcc3e48f1253ad918b6e6f08d8f0fd675e
|
Provenance
The following attestation bundles were made for checkcrontab-0.0.12.tar.gz:
Publisher:
publish.yml on wachawo/checkcrontab
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
checkcrontab-0.0.12.tar.gz -
Subject digest:
ac11d55e7db1620e2086f2869602f973b452ffd223670eae017e4da7d1c738d0 - Sigstore transparency entry: 621729159
- Sigstore integration time:
-
Permalink:
wachawo/checkcrontab@cfc007cbacf662784b73e82325defcf30135e2ce -
Branch / Tag:
refs/tags/0.0.12 - Owner: https://github.com/wachawo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cfc007cbacf662784b73e82325defcf30135e2ce -
Trigger Event:
push
-
Statement type:
File details
Details for the file checkcrontab-0.0.12-py3-none-any.whl.
File metadata
- Download URL: checkcrontab-0.0.12-py3-none-any.whl
- Upload date:
- Size: 18.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b7c526465a30bbe36a8880a4cd7b1a09c1314032fa67745dd6679bd4e4cb682
|
|
| MD5 |
c0c440079bbe01d29227dcb38d8d2664
|
|
| BLAKE2b-256 |
d9c84a5490363fc02cee1e8d65eacc8f06889513d36339c44d777d8de23ad0a0
|
Provenance
The following attestation bundles were made for checkcrontab-0.0.12-py3-none-any.whl:
Publisher:
publish.yml on wachawo/checkcrontab
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
checkcrontab-0.0.12-py3-none-any.whl -
Subject digest:
9b7c526465a30bbe36a8880a4cd7b1a09c1314032fa67745dd6679bd4e4cb682 - Sigstore transparency entry: 621729168
- Sigstore integration time:
-
Permalink:
wachawo/checkcrontab@cfc007cbacf662784b73e82325defcf30135e2ce -
Branch / Tag:
refs/tags/0.0.12 - Owner: https://github.com/wachawo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cfc007cbacf662784b73e82325defcf30135e2ce -
Trigger Event:
push
-
Statement type: