<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Systemd - tag - 沐木</title><link>https://oldletter.cn/tags/systemd/</link><description>Systemd - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 10 Apr 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/systemd/" rel="self" type="application/rss+xml"/><item><title>信创实战：Java 服务管理脚本（生产级）</title><link>https://oldletter.cn/posts/xinchuang-03-java-service-script/</link><pubDate>Thu, 10 Apr 2025 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/xinchuang-03-java-service-script/</guid><description><![CDATA[<blockquote>
<p>系列：信创国产化适配 | 作者：lin | 日期：2026-05-15</p></blockquote>
<hr>
<h2 id="一背景与问题">一、背景与问题</h2>
<h3 id="11-为什么需要专业的-java-服务管理脚本">1.1 为什么需要专业的 Java 服务管理脚本</h3>
<p>在很多项目中，Java 服务的启动方式还停留在：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># ❌ 野蛮启动方式</span>
</span></span><span class="line"><span class="cl">nohup java -jar app.jar &gt; app.log 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">&amp;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="nv">$!</span> &gt; app.pid</span></span></code></pre></div></div>
<p>这种方式存在诸多问题：</p>
<table>
  <thead>
      <tr>
          <th>问题</th>
          <th>影响</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>进程意外退出后无法自动重启</td>
          <td>服务不可用，需人工介入</td>
      </tr>
      <tr>
          <td>停止服务直接 <code>kill -9</code></td>
          <td>数据丢失、连接池未关闭</td>
      </tr>
      <tr>
          <td>没有 PID 管理</td>
          <td>重复启动、僵尸进程</td>
      </tr>
      <tr>
          <td>日志输出到 nohup.out</td>
          <td>日志无法轮转，磁盘被打满</td>
      </tr>
      <tr>
          <td>无法集成 systemd</td>
          <td>不符合 Linux 服务管理规范</td>
      </tr>
      <tr>
          <td>每次部署手动操作</td>
          <td>容易出错，效率低下</td>
      </tr>
  </tbody>
</table>
<h3 id="12-设计目标">1.2 设计目标</h3>
<p>我们要实现一个生产级的 Java 服务管理脚本，满足以下要求：</p>
<ol>
<li><strong>自动检测 Java</strong>：JAVA_HOME → 常见安装路径 → PATH，三级探测</li>
<li><strong>自动识别 jar</strong>：无需硬编码 jar 文件名</li>
<li><strong>首次部署兼容</strong>：自动创建目录结构、移动配置文件</li>
<li><strong>systemd 集成</strong>：一键安装/卸载系统服务</li>
<li><strong>受控停机</strong>：发送 SIGTERM 并等待，超时后再由策略决定是否发送 SIGKILL</li>
<li><strong>PID 文件管理</strong>：防止重复启动，精确控制进程</li>
</ol>
<hr>
<h2 id="二jvm-堆内存分配公式">二、JVM 堆内存分配公式</h2>
<p>在配置 <code>JAVA_OPTS</code> 之前，理解 JVM 内存分配至关重要：</p>]]></description></item></channel></rss>