<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alessandro Manzoli</title>
    <description>The latest articles on DEV Community by Alessandro Manzoli (@alessandro_manzoli_f01ea8).</description>
    <link>https://dev.to/alessandro_manzoli_f01ea8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4202645%2Fa9d69c85-c044-4349-b369-181bf9ea4232.png</url>
      <title>DEV Community: Alessandro Manzoli</title>
      <link>https://dev.to/alessandro_manzoli_f01ea8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alessandro_manzoli_f01ea8"/>
    <language>en</language>
    <item>
      <title>Your cron jobs are failing silently — and you won't find out until it's too late</title>
      <dc:creator>Alessandro Manzoli</dc:creator>
      <pubDate>Fri, 23 Oct 2026 13:30:14 +0000</pubDate>
      <link>https://dev.to/alessandro_manzoli_f01ea8/your-cron-jobs-are-failing-silently-and-you-wont-find-out-until-its-too-late-2819</link>
      <guid>https://dev.to/alessandro_manzoli_f01ea8/your-cron-jobs-are-failing-silently-and-you-wont-find-out-until-its-too-late-2819</guid>
      <description>&lt;p&gt;A few weeks ago I went to restore a backup. The newest file was &lt;strong&gt;three weeks old&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The cron job had quietly stopped running. No error. No email. No crash. It just… stopped — and nothing told me until the exact moment I needed it.&lt;/p&gt;

&lt;p&gt;If you run anything on a schedule — backups, syncs, cleanups, report jobs — this is the failure mode that should keep you up at night, because &lt;strong&gt;nothing is watching for it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this failure is invisible
&lt;/h2&gt;

&lt;p&gt;We tend to monitor the wrong things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Uptime checks&lt;/strong&gt; tell you a &lt;em&gt;server&lt;/em&gt; is up. The server was up. The job still didn't run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logs&lt;/strong&gt; tell you what happened — &lt;em&gt;if&lt;/em&gt; you remember to go read them. Nobody reads logs for a job they assume is working.&lt;/li&gt;
&lt;li&gt;Neither tells you that the thing you &lt;em&gt;scheduled&lt;/em&gt; simply never executed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gap — the scheduled task that silently disappears — is the one that bites.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern that fixes it: a dead man's switch
&lt;/h2&gt;

&lt;p&gt;Instead of watching for something to &lt;em&gt;happen&lt;/em&gt;, you watch for something to &lt;strong&gt;stop happening&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The job "checks in" by pinging a URL every time it succeeds:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 2 * * *  /backup.sh &amp;amp;&amp;amp; curl -fsS https://your-monitor/p/abc123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The trick is the &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;: the &lt;code&gt;curl&lt;/code&gt; only runs if &lt;code&gt;/backup.sh&lt;/code&gt; exits successfully. So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backup works → ping arrives on time → silence (all good).&lt;/li&gt;
&lt;li&gt;Backup fails, server reboots, disk fills, cron breaks → &lt;strong&gt;no ping&lt;/strong&gt; → you get alerted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your monitor just needs to know the expected interval (say, every 24h) plus a grace period (say, 1h) and alert you when a check-in doesn't show up in time. No agent to install, no library to import — if your job can run &lt;code&gt;curl&lt;/code&gt;, it can be monitored.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your options
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Roll your own:&lt;/strong&gt; a tiny service that records "last seen" per check and a cron that flags overdue ones. It's genuinely a weekend project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use an existing tool:&lt;/strong&gt; &lt;a href="https://healthchecks.io" rel="noopener noreferrer"&gt;Healthchecks.io&lt;/a&gt; (open source, self-hostable) and &lt;a href="https://cronitor.io" rel="noopener noreferrer"&gt;Cronitor&lt;/a&gt; both do this well.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'm building
&lt;/h2&gt;

&lt;p&gt;I liked the pattern so much I'm building a deliberately minimal version of it — &lt;strong&gt;Stillwatch&lt;/strong&gt; 🦉 — with one twist: a &lt;strong&gt;one-time lifetime price&lt;/strong&gt; instead of a monthly subscription. For small, personal jobs I never wanted another recurring bill just to know when something breaks.&lt;/p&gt;

&lt;p&gt;It's at the validation stage right now (landing + waitlist, MVP in progress). If this problem has ever bitten you, I'd genuinely love your take — and there's a waitlist if you want to be an early tester:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://stillwatch.netlify.app/" rel="noopener noreferrer"&gt;https://stillwatch.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One question for you:&lt;/strong&gt; how do &lt;em&gt;you&lt;/em&gt; currently catch a cron job that silently dies — a homegrown script, a paid tool, or (be honest) nothing yet?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>selfhosted</category>
    </item>
  </channel>
</rss>
