惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
Malwarebytes
Malwarebytes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cybersecurity and Infrastructure Security Agency CISA
F
Future of Privacy Forum
C
Cisco Blogs
T
The Exploit Database - CXSecurity.com
A
Arctic Wolf
S
Securelist
K
Kaspersky official blog
S
Schneier on Security
T
ThreatConnect
T
Tenable Blog
Spread Privacy
Spread Privacy
T
True Tiger Recordings
AWS News Blog
AWS News Blog
F
Fox-IT International blog
量子位
T
Threatpost
V
Vulnerabilities – Threatpost
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
GbyAI
GbyAI
宝玉的分享
宝玉的分享
腾讯CDC
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
U
Unit 42
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
O
OpenAI News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
The Register - Security
The Register - Security
MyScale Blog
MyScale Blog
小众软件
小众软件
A
About on SuperTechFans
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
美团技术团队
Google Online Security Blog
Google Online Security Blog
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog

DEV Community

Why We Deliberately Crush Lithium Batteries (UN38.3 Crush Testing Explained) Command History & Completion The Three-Body Problem: AI Code, Supply Chain Attacks, and the Talent Exodus 로컬 LLM 셋업 가이드 (v27) Building Better .NET Worker Services with Cursor Rules Generate Professional PDF Invoices via REST API — JSON In, PDF Out Redis: Big Keys Destroem o Desempenho Compartilhado Agentic AI for Cybersecurity: Autonomous Threat Detection and Response How to Automate Android Without Appium Designing XSLT transforms with parameters and multiple inputs I Downloaded Gemma4:e2b On My Macbook in 2 steps Building an Autonomous SRE Agent: From Raw Telemetry to Safe, AI-Driven Remediation The EU AI Act in 2026: Reading the Law After the Omnibus I had zero coding knowledge. Here is "RetroTube", a 2010 YouTube sandbox prototype I built using AI! How to Validate Environment Variables in TypeScript (and Why You Should) I Built a CLI Tool That Writes Better Git Commits Than I Do Transfer Fees, Metadata, and Soulbound Tokens: My First Real Token Experiments on Solana Stop Using Fetch() in React: A Better Way To Call Your Backend Creando un Tetris con JavaScript VI: Complicando el juego. DeepSeek's API Price Cut Changed My Claude Code and ChatGPT Math [Boost] Perl 🐪 Weekly #774 - Perl is too HOT How to Track AI Usage Without Losing Revenue (Complete Guide) 77 Rules Later: What Graduating Our First Stack Actually Looked Like RAG 시스템 실전 구축 (v26) When Premature Scaling Leads to Operator Burnout Multi-Repo Microservice Changes Are a Coordination Problem. I Solved It With AI Agent Teams. The Next Frontier: How Multi-Agent Systems are Redefining Productivity The Kimwolf Bust Just Outed Android Webcams as Botnet Fodder — Here's the Question Every Repurposed-Phone Camera Setup Has to Answer I'm an autonomous AI agent. I shipped 18 fixes to myself in one session. Building a Secure Future with Zero Trust Security Architecture Asynchronous Functions in Dart How I migrated magic-link login from Resend to AWS SES + Lambda five days before launch Edge Computing He creado una empresa ficticia IT/OT para poder encontrar sus vulnerabilidades y reforzar su seguridad en sus activos críticos Why I Built @editora/react I built a tiny UGC script generator because hooks are the hardest part The Phone Is Becoming the New Terminal Why Most AI Music Tools Feel Wrong to Developers Goroutines vs. Promises: Why Go and JavaScript Look at Concurrency Completely Differently How I Use Antigravity 2.0 to Navigate Open-Source Codebases and Make Better Technical Decisions Understanding Basic HTML & CSS Concepts for Beginners Go Error Handling: Annoying or Awesome? Your To-Do List Doesn't Know You — So I Gave Mine Three Brains Shell Basics (Bash, Zsh, Sh) Free MongoDB GUI Tool for Developers, Students, and Teams Designing High-Performance Blockchain Indexers Choosing Models for an Agentic Chat App on Amazon Bedrock How Smart Growth Teams Automate Their Marketing Stack in 2026 (Without Hiring More People) What I Learned About Memory-Augmented AI Agents Seven Docker Tips Every Engineer Should Know (from Docker Captains) Welcome to the Fast-Food Era of Testing: Over-Weight by Tests How to use Claude in vscode? Prompt Engineering for Automated Evaluation: Making LLMs the Judge in AI Builder Solutions Full Stack Projects Are Not Enough Anymore Virtualization & Cloud Basics Orakle: Turning Raw Blockchain Data into Intelligence with Gemma 4 Building an Autoposting Pipeline with Hermes Agent: Why Waterfall Beats Parallel, and the Edge Cases Nobody Talks About OpenShift Virtualization Migration Advisor — Local-First, Powered by Gemma 4 26B MoE WebMCP is coming — so I’m building webmcp.js I Disappeared for 4 Months After Launch - Here's What Brought Me Back Jira Is Turing-Complete (And You've Been Coding in It) NyayAI: Building an AI Legal Assistant for 1.4 Billion People — A Technical Deep Dive E-commerce Order Automation: Stripe + Invoice + Shipping Workflow How to Evaluate AI Agents: LLM-as-Judge Tutorial The Interview Prep Stack I Used as a Senior Software Engineer Targeting Big Tech Gemma4 Challenge OptiLearn - Powered by Google Gemma 4 Aura — The Gemma 4 Powered Agentic Web Copilot & Self-Healing Accessibility Engine I built a tool that catches misleading charts using Gemma 4 running locally Worklog companion with Gemma4 GBase: Building LLM Agents That Actually Learn from Their Mistakes Blossom — a small step toward student mental wellbeing WordPress Performance Monitoring: A Complete Guide Principal Components in TypeScript (Part 4) When three sharp wallets agree: what consensus signals on Polymarket actually mean I Built a Fail-Fast Rust Scheduler with Background OAuth Auto-Refresh (Part 2) Sharing is caring How Putting Faces (Literally) to My AI Garden Images Gave It a Personality Sofi Log #001: Thailand's Tourism Tax & the 180-Day AI Surveillance Wall Sofi Log #006: Decentralized IP-Address Obfuscation Specs Sofi Log #008: Bypassing Legacy Cross-Border Bank Fee Traps Secret Rotation Automation: The Operational Cost of Security Sofi Log #009: Portable Identity & DID Passport Framework Sofi Log #011: Autonomous Smart Treasury Repatriation Specs History of Linux & Unix I asked Claude if my plan was on track for the goal — and got an honest 'No' PHPStan 'expects X, Y given' — the trace it doesn't give you Using Gemma4 2B to Assist Community Health Workers Open-source Playwright wrapper that passes bot.sannysoft.com, pixelscan, and CreepJS in headless mode Policy Storyteller: Turning Nepali Bills into Human Stories with Gemma 4 Avoid Cross Module Dependencies with Dependency Cruiser Invariant-Driven Architecture: 20M transactions on a €80/mo Cloud VM. Stop using external npm packages just to generate a UUID v4 Choosing the Right Gemma 4 Model Matters More Than Choosing the Best One Your LLM Is Not an Agent. Your Framework Is Not Enough. You Need a Harness. From HTTPS to UCP: Shopping Is About to Stop Being Your Problem From Creation to Consumption: How Antigravity 2.0 and Gemini Spark Are Defining the Agentic Era 10 Mistakes I Wish I Knew Before Taking the CKA Exam AI That Actually Does Stuff: Autonomous Agents Explained
Cron vs systemd daemon: which one for Node.js?
Odilon HUGON · 2026-05-25 · via DEV Community

Odilon HUGONNOT

On the same machine, two Node.js scripts run in the background. The first publishes to dev.to at 9am and LinkedIn at 10am — a cron, three lines of config. The second watches a job queue every 30 seconds, keeps state in memory, and reacts to user interface actions within seconds — a daemon supervised by systemd.

Same language, same server, apparently the same goal: run tasks in the background. Yet the choice is different. It's not a matter of taste or habit — it's that the two problems only look similar from a distance.

The simple case: a cron for publishing

The publishing cron is deliberately boring. A user crontab entry:

0 9 * * * bash /home/folken/work/cv/scripts/devto-cron.sh >> logs/devto-cron.log 2>&1
0 10 * * * /usr/bin/node /home/folken/work/cv/scripts/linkedin-cron.js >> logs/linkedin-cron.log 2>&1

Enter fullscreen mode Exit fullscreen mode

The shell script loads environment variables from a .env file and calls the Node.js script. That script reads devto-schedule.json, picks the first article with drafted status, calls the dev.to API, updates the file, and exits. Runtime: a few seconds. On failure, the log contains the error, the article stays in queue for the next day.

Why does cron work here? Because the task is atomic. It doesn't need to know what happened yesterday. It doesn't need to react to an external event. It won't overlap with itself. A process starts, does its job, stops. That's exactly what cron was designed for.

Where cron starts to fall short

The automated monitoring system poses a different problem. There are four active monitors (crypto, tech, Epstein, retro), each with its own frequency (from 6 hours to 7 days). The admin interface allows manually triggering a monitor from the browser. A "generate" job can be queued at any time to reconfigure a monitor via Claude.

With a cron, you quickly run into several problems:

  • Minimum 1-minute granularity. Can't react in 5 or 10 seconds to a job queued from the UI. The user clicks, waits, sees nothing happen.
  • No state between runs. To know when each monitor last ran, you need to read it from a file at each startup. Not catastrophic, but it complicates coordination between multiple monitors sharing the same resources.
  • No job queue. If two crons trigger simultaneously and both try to write the same files, you need to handle overlap with flock or equivalent — which works, but requires attention.
  • No native structured logging. Stdout redirected to a file becomes unreadable quickly when multiple monitors write to the same log in parallel.

None of these limits are individually insurmountable. But stacked together, they signal that you're trying to make cron do something outside its domain.

The daemon: a process that never sleeps

veille-daemon.js runs continuously. It polls jobs.json every 30 seconds for on-demand jobs, and cron-config.json every 60 seconds to trigger scheduled monitors whose frequency has elapsed. It keeps the monitor registry and current run state in memory.

When the user clicks "Rerun" in the interface, PHP writes a job to jobs.json. The daemon picks it up at the next poll (30 seconds worst case), executes it, and updates the status. The interface can display progress in real time via a /veille/status endpoint.

systemd supervises the daemon with a minimal .service file:

[Unit]
Description=Veille daemon
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/folken/work/cv
ExecStart=/usr/bin/node scripts/veille-daemon.js
Restart=on-failure
RestartSec=10

[Install]
WantedBy=default.target

Enter fullscreen mode Exit fullscreen mode

What this concretely provides: automatic restart on crash, logs in journald (journalctl --user -u veille-daemon -f), automatic startup on boot with systemctl --user enable veille-daemon. No more manual restart scripts, no more separate log file to watch.

systemd timer: the middle ground

There's a third option that often gets overlooked: the systemd timer. It's essentially an enhanced cron — a periodic task, but supervised by systemd. On this project, crypto-veille.timer is a legacy example:

# crypto-veille.service
[Unit]
Description=Crypto veille job
After=network.target

[Service]
Type=oneshot
WorkingDirectory=/home/folken/work/cv
ExecStart=/usr/bin/node scripts/crypto-veille.js

Enter fullscreen mode Exit fullscreen mode

# crypto-veille.timer
[Unit]
Description=Crypto veille — every 6h

[Timer]
OnBootSec=5min
OnUnitActiveSec=6h

[Install]
WantedBy=timers.target

Enter fullscreen mode Exit fullscreen mode

Compared to a cron, the systemd timer adds: native logs in journald, the ability to declare dependencies (After=network.target), a boot delay with OnBootSec (cron can fire too early if the machine just rebooted), and more readable calendar expressions than classic cron syntax.

The trade-off: two files to manage instead of one line. For a simple task that doesn't need structured logs and whose minimum frequency is 1 minute, cron remains more direct.

Comparison table

cron

systemd timer

daemon

Granularity

1 min minimum

1 second

free (polling)

Logs

manual file

native journald

native journald

State between runs

none

none

in memory

On-demand reaction

no

no

yes

Crash supervision

no

yes

yes

Config complexity

very low

medium (2 files)

high (code to write)

Ideal use case

atomic periodic task

periodic task + logs/deps

job queue, state, on-demand

Three questions to choose

In practice, three questions are enough to guide the choice:

1. Does the task need to react to an event in under a minute?

If yes: daemon. Cron can't do better than one minute, and neither can a systemd timer (it runs scheduled tasks, not reactive ones).

2. Does it need state between runs?

If yes: daemon. Reading and writing a file at each run works up to a point, but once there are multiple workers or decisions to make based on recent history, a continuous process with in-memory state is cleaner.

3. Do structured logs and supervision matter?

If yes but the first two answers are no: systemd timer. It gives you the systemd benefits (journald, restart, dependencies) without the complexity of writing an event loop.

If all three answers are no: cron. Three lines in the crontab, a redirect to a log file, zero additional infrastructure. Don't over-engineer what doesn't need it.

Conclusion

Both approaches coexist without friction on the same machine. The cron has been publishing articles on schedule for years without ever needing a manual restart. The monitoring daemon took a few days of work to make robust — crash handling, TTL on stuck states, recovery after restart.

It's not cron OR daemon. It's recognizing which one matches the problem at hand. Fixed-schedule publishing doesn't need to react in 30 seconds. Interactive monitoring can't afford to wait a minute between checks. The choice is in the problem, not the technology.

📄 Associated CLAUDE.md

ViewDownloadCatalogue