<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Systemd on CAO ZUOHUA</title><link>https://caozuohua.github.io/tags/systemd/</link><description>Recent content in Systemd on CAO ZUOHUA</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 14 Sep 2026 11:30:00 +0800</lastBuildDate><atom:link href="https://caozuohua.github.io/tags/systemd/index.xml" rel="self" type="application/rss+xml"/><item><title>不仅是定时：使用 systemd 构建企业级自动化运维体系</title><link>https://caozuohua.github.io/posts/2026-09-14-linux-systemd-ops/</link><pubDate>Mon, 14 Sep 2026 11:30:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-14-linux-systemd-ops/</guid><description>&lt;h1 id="不仅是定时使用-systemd-构建企业级自动化运维体系"&gt;不仅是定时：使用 systemd 构建企业级自动化运维体系&lt;/h1&gt;&#10;&lt;p&gt;在 Linux 环境下，如何让服务“永远在线”？对于企业级 Agent 系统而言，答案通常不是编写一个死循环的 Shell 脚本，而是将任务交给系统最底层的管家——&lt;code&gt;systemd&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h2 id="1-为什么弃用用户态-daemon"&gt;1. 为什么弃用用户态 Daemon？&lt;/h2&gt;&#10;&lt;p&gt;在之前的运维实践中，我们尝试过使用自定义的 &lt;code&gt;blog_daemon&lt;/code&gt; 进行自动化调度，但结果证明它不可靠：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;状态丢失&lt;/strong&gt;：Daemon 若因崩溃、重启或环境抖动导致 PID 文件丢失，整个调度机制就会“瘫痪”。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;权限与依赖限制&lt;/strong&gt;：Daemon 难以管理任务间的依赖顺序，也无法精准进行资源限制（如 CPU/内存配额）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2-systemd-的核心优势"&gt;2. systemd 的核心优势&lt;/h2&gt;&#10;&lt;p&gt;将任务转交给 &lt;code&gt;systemd&lt;/code&gt;（通过 &lt;code&gt;.service&lt;/code&gt; 与 &lt;code&gt;.timer&lt;/code&gt;），意味着将任务的生存责任交给了内核：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;内核级保障&lt;/strong&gt;：&lt;code&gt;systemd&lt;/code&gt; 与内核紧密协作，即使服务崩溃，它也能通过 &lt;code&gt;Restart=always&lt;/code&gt; 实现秒级恢复。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;资源限制 (Cgroups)&lt;/strong&gt;：通过配置 &lt;code&gt;MemoryMax&lt;/code&gt; 或 &lt;code&gt;CPUQuota&lt;/code&gt;，可以防止 Agent 因死循环或内存泄露耗尽主机所有资源。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;依赖管理&lt;/strong&gt;：通过 &lt;code&gt;After=network.target&lt;/code&gt;，确保服务在网络就绪后再启动，解决了 Daemon 启动时常见的“网络不可用”问题。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="3-局限性与避坑指南"&gt;3. 局限性与避坑指南&lt;/h2&gt;&#10;&lt;p&gt;尽管 &lt;code&gt;systemd&lt;/code&gt; 强大，但它并非完美，在生产环境中需注意：&lt;/p&gt;&#10;&lt;h3 id="systemd-的局限性"&gt;systemd 的局限性：&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;侵入性强&lt;/strong&gt;：配置需要 Root 权限。在部分云原生环境（如只读文件系统）中，我们无法触及系统级目录，此时 &lt;code&gt;systemd&lt;/code&gt; 会失效。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;配置复杂&lt;/strong&gt;：相比 crontab，&lt;code&gt;systemd&lt;/code&gt; 的配置逻辑冗长。如果项目环境多变，配置迁移成本高。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;单点风险&lt;/strong&gt;：&lt;code&gt;systemd&lt;/code&gt; 本身是系统守护进程，一旦它出现异常，整个系统的服务管理将瞬间停滞（尽管这种情况极少见）。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="避坑指南"&gt;避坑指南：&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;配置验证&lt;/strong&gt;：在上线前，务必使用 &lt;code&gt;systemd-analyze verify&lt;/code&gt; 检查语法，防止服务启动失败导致雪崩。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;日志归一化&lt;/strong&gt;：&lt;code&gt;systemd&lt;/code&gt; 托管的服务日志默认由 &lt;code&gt;journald&lt;/code&gt; 管理，需配置好日志轮转，防止 &lt;code&gt;/var/log&lt;/code&gt; 空间被写满。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;非 Root 环境替代方案&lt;/strong&gt;：如果环境限制无法使用 &lt;code&gt;systemd&lt;/code&gt;（如无 Root 权限的容器内），请考虑 &lt;strong&gt;&lt;code&gt;supervisord&lt;/code&gt;&lt;/strong&gt; 或基于 &lt;strong&gt;容器调度器 (K8s/Nomad)&lt;/strong&gt; 的健康检查机制，而非编写简易 Daemon。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="4-企业级最佳实践systemd-配置模板"&gt;4. 企业级最佳实践：Systemd 配置模板&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/systemd/system/agent-task.timer&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Unit]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Description&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Daily Agent Task Timer&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Timer]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;OnCalendar&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;*-*-* 12:00:00&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Persistent&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Install]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;WantedBy&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;timers.target&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="总结"&gt;总结&lt;/h2&gt;&#10;&lt;p&gt;对于企业级 Agent 系统，追求“高可靠性”的关键不在于代码写得多么复杂，而在于如何高效地利用操作系统的管理能力。&lt;code&gt;systemd&lt;/code&gt; 是 Linux 运维的定海神针，但我们也需清楚它的边界——当系统权限受到限制时，拥抱云原生架构（如 GitHub Actions/K8s）将是更优雅的选择。&lt;/p&gt;</description></item></channel></rss>