Zactonz Cron Doctor
v1.0.0See whether your cron jobs really run, and fix the ones that do not.
FAQ
Does it change my cron jobs?#
Only the ones you ask it to, and only the command. The schedule stays in the crontab where cPanel's own Cron Jobs page can still edit it. The original line is stored so it can be put back exactly.
Can I undo it?#
Yes. Stop monitoring on the job page restores the original command. Cron Doctor also saves a copy of the whole crontab before every change it makes and keeps the newest thirty, each restorable in one click from Settings.
What happens to my jobs if I uninstall the plugin?#
Nothing. They keep running. The runner lives in each account's home directory, not in the plugin directory, so removing the plugin cannot stop a monitored job. If you would rather have the plain crontab lines back, use Stop monitoring on each job before you uninstall.
Will it slow my jobs down?#
No measurably. On a cPanel server the runner adds about four milliseconds per run. A job with no time limit is executed directly, with nothing polling it.
Will I stop getting cron email?#
You will stop getting it for successful runs, which is the point. A monitored job stays quiet when it succeeds and prints its captured output when it fails, so cron mails you only when something is wrong. This is per-job and can be set back to every run, or to never.
If your crontab sets MAILTO to an empty value, cron sends nothing at all, and Cron Doctor reports that as a problem.
Who can read the captured output?#
Only the account owner and root. It is written with owner-only permissions into a folder in the account's home directory, never inside a document root, and it is never served as a file — the interface reads it and escapes it. It can be deleted per job or for the whole account at any time, and how much is kept is configurable.
Does it work under CloudLinux and CageFS?#
Yes, and the design assumes it. The runner is deployed into the account's home directory precisely because CageFS hides /usr/local/cpanel from the account's cron jobs.
One consequence worth knowing: the cPanel interface runs outside the jail while cron runs inside it, so the two can see different filesystems. The "file is not there" check therefore only considers paths inside the account's home directory, where both see the same thing.
What if my account cannot run commands?#
Cron Doctor falls back to read-only mode: it reads the crontab through the cPanel API, runs every check and explains every finding, but writes nothing. The dashboard says so at the top.
Does it need a database or any dependencies?#
No. No database, no Composer, no third-party libraries. State is JSON files in the account's home directory.
Can it monitor a job that contains a %?#
Yes. In a crontab the first unescaped % ends the command and everything after it becomes the job's standard input, with each further % turned into a newline. Cron Doctor implements that rule exactly, stores the command and its input separately, and feeds the input to the job from a file. Because the wrapped crontab line contains no % at all, a command such as date +\%Y cannot be damaged by being monitored.
What about @reboot jobs?#
They are listed and can be monitored, and their runs are recorded. They are never reported as overdue, because @reboot has no next scheduled time to compare against.
Which PHP does the alert check use?#
The newest EasyApache version installed, falling back to /usr/local/bin/php. It needs PHP 7.4 or newer and says so on standard error if it cannot find one, at most once every six hours so a broken server does not fill your inbox.
Is it safe to run on a shared server?#
It grants no privilege an account does not already have — anything the runner executes, that account could already have put in its own crontab. The runner refuses to run at all if its directory or command file is owned by another user or writable by anyone but the owner. The full reasoning is in the repository under docs/security.md.
Where do I report a problem?#
Open an issue on GitHub. For something security-sensitive, email security@zactonz.com instead of filing a public issue.