Help

Install, the first run, the popover, the detail view, actions, Full Disk Access, licensing, uninstalling.

Install

Download CronMon.dmg, drag CronMon to Applications, and open it. CronMon lives in the menu bar; there is no Dock icon. With Homebrew: brew tap suresk/tap && brew install --cask suresk/tap/cronmon. It needs macOS 14 or later, asks for no password, and installs nothing in the background.

The first run

Click the clock icon in the menu bar. CronMon reads your crontab with crontab -l, reads the launchd property lists in ~/Library/LaunchAgents, /Library/LaunchAgents, /Library/LaunchDaemons and the two /System directories, keeps the ones with a StartCalendarInterval or a StartInterval, and asks launchctl print what state each one is in. That takes a moment the first time and happens again whenever you open the popover, whenever one of those directories changes, and when you pick Refresh. There is no timer and nothing runs in the background except the cron watcher described below.

macOS schedules hundreds of its own agents and daemons. They are hidden until you turn on Include the jobs that ship with macOS in Settings, and they stay read-only.

Reading the popover

If the header says "cron isn't running", that is usually fine: launchd only starts cron once a crontab exists, so a Mac with no crontab has no cron process. The line says which case you are in.

The job detail window

Return, or Open Job, opens a window for the selected job: the schedule in plain English beside the raw expression, the next five runs, the full command with a Copy button, the file it came from with Reveal in Finder and Open, anything CronMon thinks is worth knowing about it, and its history.

History is labelled by where it came from. For a launch agent the section is headed What launchd reports: the run count, the last run and the last exit code, straight from launchctl print. For a cron job it is headed What CronMon has seen, because nothing on macOS records cron runs — there are no cron entries in the unified log at any level. CronMon watches the cron process while CronMon is running and lists the runs it saw, with the date it started watching. Turn on Launch CronMon at login in Settings so it sees the ones that happen before you open it. If cron mailed the job's output, the last message from /var/mail/ is shown underneath.

Run now

For a cron job, Run Now runs the command through /bin/sh -c with the environment cron would have given it — PATH=/usr/bin:/bin unless your crontab sets one, plus HOME, SHELL and your user name — and files what it printed as a run you can read in the history, marked as started by you. For a launch agent it asks launchd to start the job with launchctl kickstart. Launch daemons and anything under /System cannot be started this way in 0.1.0 and say so.

Disable and enable

For a cron job, Disable comments out exactly one line by putting #CRONMON-DISABLED in front of it, and Enable takes that marker off again. Before either, CronMon writes a copy of your whole crontab to ~/Library/Application Support/CronMon/crontab-backups/, named with the time; afterwards it reads the crontab back and checks the line is what it expected. Nothing else in the file changes — comments, blank lines and environment lines come back byte for byte. A disabled line stays in the list with a badge, so you can put it back.

The first time you disable or enable a cron job, macOS asks whether CronMon "would like to administer your computer", and warns that administration can include modifying passwords, networking and system settings. That is macOS's standard prompt for /usr/bin/crontab, which is installed setuid root so that it can write into the crontab spool directory — you get the same prompt the first time your terminal writes a crontab. CronMon only ever rewrites one line of your own crontab, and only after saving a backup. If you decline, the change times out and your crontab is left untouched.

For a launch agent, Disable is launchctl bootout and Enable is launchctl bootstrap. CronMon will not load or unload macOS's own jobs, and daemons need more privilege than 0.1.0 has.

Give cron Full Disk Access

A cron job that touches ~/Desktop, ~/Documents, ~/Downloads or a volume under /Volumes fails with "Operation not permitted" until macOS is told to let cron in. CronMon flags those jobs; here is the fix:

  1. Open System Settings › Privacy & Security › Full Disk Access.
  2. Click +. In the file chooser press ⇧⌘G and type /usr/sbin/cron.
  3. Choose cron and switch it on.

The permission applies to the cron daemon, not to your script, and it takes effect on the job's next run. It is per-Mac and survives updates. There is a longer guide with the ways it goes wrong.

Settings

Launch at login; show the number of jobs due in the next hour in the menu bar; include the jobs that ship with macOS; look ahead 6 hours, 24 hours or 7 days; check for updates automatically.

CronMon's Settings window: General with launch at login, the menu bar count and the macOS jobs switch; Timeline with the 6 hours, 24 hours and 7 days choices; Updates with the automatic check and a Check Now button.

Copy Summary

Copy Summary, in the gear menu and in the detail window, puts the list as you have it on screen on the clipboard as plain text: the summary line, what is coming up, and a row per job with its schedule, next run and state. It is not gated by the license — it copies what is already in front of you.

License

The 14-day trial is unrestricted. When it ends everything stays visible; running jobs now and enabling or disabling them need a license. Buy one at polar.sh for $19, then paste the key into CronMon › License… One key activates three Macs; free one from the customer portal. A license includes a year of updates; after that the app keeps working and a renewal is $9/year.

Uninstalling

Quit CronMon from the gear menu and drag it to the Trash. Nothing is left running: CronMon installs no background service and adds nothing to your crontab or to launchd beyond the Launch at login registration, which goes with the app. With Homebrew, brew uninstall --cask cronmon; brew uninstall --zap --cask cronmon also removes preferences and ~/Library/Application Support/CronMon, which is where the crontab backups live — copy them out first if you want to keep them.

If you disabled cron jobs with CronMon and want them back, enable them before you uninstall, or take the #CRONMON-DISABLED marker off the lines yourself with crontab -e.

Something else?

Email [email protected], or open an issue at github.com/suresk/cronmon/issues. The Copy Summary text is the most useful thing to include.