<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>systemd on TripleZ&#39;s Blog</title>
    <link>https://blog.triplez.cn/tags/systemd/</link>
    <description>Recent content in systemd on TripleZ&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 31 Mar 2022 20:31:19 +0800</lastBuildDate><atom:link href="https://blog.triplez.cn/tags/systemd/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>通过 systemd 服务配置链接动态库</title>
      <link>https://blog.triplez.cn/posts/systemd-binary-service-dynamic-linking/</link>
      <pubDate>Thu, 31 Mar 2022 20:31:19 +0800</pubDate>
      
      <guid>https://blog.triplez.cn/posts/systemd-binary-service-dynamic-linking/</guid>
      <description>巧用 systemd 与 LD_LIBRARY_PATH</description>
      <content:encoded><![CDATA[<h2 id="序">序</h2>
<p>在设置动态链接的方法中，<code>rpath</code> 有其自身的问题<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> ， <code>ld.so.conf</code> 为 OS 全局配置，可能会因为单一服务的动态库版本而影响到其他服务，不是一个优雅的方法。</p>
<p>那如何才能不借助 <code>rpath</code> 和 <code>ld.so.conf</code> ，即能使目标服务找到对应的动态链接库，又能不影响其他服务呢？</p>
<h2 id="ld_library_path">LD_LIBRARY_PATH</h2>
<p>对于动态链接库的路径配置而言，除了 <code>rpath</code> 和 <code>ld.so.conf</code> ，还有 <code>LD_LIBRARY_PATH</code>。只要在二进制启动的环境中设置 <code>LD_LIBRARY_PATH</code> 变量，则 <code>glibc</code> 会将该变量中的路径配置作为动态链接库的查找路径之一，使得二进制可执行文件能够正常链接到其依赖的动态链接库。</p>
<p><code>LD_LIBRARY_PATH</code> 会在当前 shell session 中“全局”生效，不过，由于笔者服务采用 systemd 来管理其生命周期，按照上述思路，应该只需要在服务启动前，将 <code>LD_LIBRARY_PATH</code> 注入启动环境即可，这样还能够借助 systemd 来实现一定程度的环境“隔离”。systemd 服务配置中的 <code>Environment</code> 字段是用于描述启动环境的环境变量的，我们先在这里加入 <code>LD_LIBRARY_PATH</code> （如下），重新加载 systemd 配置并重启服务，观察效果。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-0-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-1"> 1</a>
</span><span class="lnt" id="hl-0-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-2"> 2</a>
</span><span class="lnt" id="hl-0-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-3"> 3</a>
</span><span class="lnt" id="hl-0-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-4"> 4</a>
</span><span class="lnt" id="hl-0-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-5"> 5</a>
</span><span class="lnt" id="hl-0-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-6"> 6</a>
</span><span class="lnt" id="hl-0-7"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-7"> 7</a>
</span><span class="lnt" id="hl-0-8"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-8"> 8</a>
</span><span class="lnt" id="hl-0-9"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-9"> 9</a>
</span><span class="lnt" id="hl-0-10"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-10">10</a>
</span><span class="lnt" id="hl-0-11"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-11">11</a>
</span><span class="lnt" id="hl-0-12"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-12">12</a>
</span><span class="lnt" id="hl-0-13"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-13">13</a>
</span><span class="lnt" id="hl-0-14"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-14">14</a>
</span><span class="lnt" id="hl-0-15"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-15">15</a>
</span><span class="lnt" id="hl-0-16"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-16">16</a>
</span><span class="lnt" id="hl-0-17"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-17">17</a>
</span><span class="lnt" id="hl-0-18"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-18">18</a>
</span><span class="lnt" id="hl-0-19"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-19">19</a>
</span><span class="lnt" id="hl-0-20"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-20">20</a>
</span><span class="lnt" id="hl-0-21"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-21">21</a>
</span><span class="lnt" id="hl-0-22"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-22">22</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-diff" data-lang="diff"><span class="line"><span class="cl"> [Unit]
</span></span><span class="line"><span class="cl"> Description=Nginx
</span></span><span class="line"><span class="cl"> After=syslog.target network.target remote-fs.target nss-lookup.target
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> [Service]
</span></span><span class="line"><span class="cl"> User=triplez
</span></span><span class="line"><span class="cl"> Group=triplez
</span></span><span class="line"><span class="cl"> Type=forking
</span></span><span class="line"><span class="cl"><span class="gi">+Environment=&#34;LD_LIBRARY_PATH=/your/path/to/openssl/lib:/your/path/to/jemalloc/lib:/your/path/to/luajit/lib&#34;
</span></span></span><span class="line"><span class="cl"><span class="gi"></span> PIDFile=/run/nginx/nginx.pid
</span></span><span class="line"><span class="cl"> RuntimeDirectory=nginx
</span></span><span class="line"><span class="cl"> RuntimeDirectoryMode=0755
</span></span><span class="line"><span class="cl"> ExecStartPre=/your/path/to/nginx -t
</span></span><span class="line"><span class="cl"> ExecStart=/your/path/to/nginx
</span></span><span class="line"><span class="cl"> ExecReload=/bin/kill -s HUP $MAINPID
</span></span><span class="line"><span class="cl"> ExecStop=/bin/kill -s QUIT $MAINPID
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> PrivateTmp=true
</span></span><span class="line"><span class="cl"> Restart=always
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> [Install]
</span></span><span class="line"><span class="cl"> WantedBy=multi-user.target
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-1-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-1">1</a>
</span><span class="lnt" id="hl-1-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-2">2</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo systemctl daemon-reload
</span></span><span class="line"><span class="cl">$ sudo systemctl restart nginx.service
</span></span></code></pre></td></tr></table>
</div>
</div><p>事实上，对于大多数服务，只需要加入环境变量即可解决问题。但很不幸的是，由于我们的服务需要监听 1024 及以下端口（如 80、443），笔者对二进制可执行文件进行了 <code>setcap</code> 操作，赋予其监听低位端口的能力。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-2-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-1">1</a>
</span><span class="lnt" id="hl-2-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-2">2</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo getcap /your/path/to/nginx
</span></span><span class="line"><span class="cl">/your/path/to/nginx <span class="o">=</span> cap_net_bind_service+ep
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="capability">Capability</h2>
<p>由于该文件含有 capability，<code>glibc</code> 会将 <code>LD_LIBRARY_PATH</code> 忽略<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>，导致服务还是无法正确链接到动态库上。</p>
<p>了解原因之后，接下来要做的事情也很清晰了：一是先将二进制可执行文件上的 capability 移除（<code>chown</code> 就可以将其移除， <code>setcap -ep</code> 亦可），二是利用 systemd 的服务配置来实现配置 capability （如下）。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-3-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-1"> 1</a>
</span><span class="lnt" id="hl-3-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-2"> 2</a>
</span><span class="lnt" id="hl-3-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-3"> 3</a>
</span><span class="lnt" id="hl-3-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-4"> 4</a>
</span><span class="lnt" id="hl-3-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-5"> 5</a>
</span><span class="lnt" id="hl-3-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-6"> 6</a>
</span><span class="lnt" id="hl-3-7"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-7"> 7</a>
</span><span class="lnt" id="hl-3-8"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-8"> 8</a>
</span><span class="lnt" id="hl-3-9"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-9"> 9</a>
</span><span class="lnt" id="hl-3-10"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-10">10</a>
</span><span class="lnt" id="hl-3-11"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-11">11</a>
</span><span class="lnt" id="hl-3-12"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-12">12</a>
</span><span class="lnt" id="hl-3-13"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-13">13</a>
</span><span class="lnt" id="hl-3-14"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-14">14</a>
</span><span class="lnt" id="hl-3-15"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-15">15</a>
</span><span class="lnt" id="hl-3-16"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-16">16</a>
</span><span class="lnt" id="hl-3-17"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-17">17</a>
</span><span class="lnt" id="hl-3-18"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-18">18</a>
</span><span class="lnt" id="hl-3-19"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-19">19</a>
</span><span class="lnt" id="hl-3-20"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-20">20</a>
</span><span class="lnt" id="hl-3-21"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-21">21</a>
</span><span class="lnt" id="hl-3-22"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-22">22</a>
</span><span class="lnt" id="hl-3-23"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-23">23</a>
</span><span class="lnt" id="hl-3-24"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-24">24</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-diff" data-lang="diff"><span class="line"><span class="cl"> [Unit]
</span></span><span class="line"><span class="cl"> Description=Nginx
</span></span><span class="line"><span class="cl"> After=syslog.target network.target remote-fs.target nss-lookup.target
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> [Service]
</span></span><span class="line"><span class="cl"> User=triplez
</span></span><span class="line"><span class="cl"> Group=triplez
</span></span><span class="line"><span class="cl"> Type=forking
</span></span><span class="line"><span class="cl"> Environment=&#34;LD_LIBRARY_PATH=/your/path/to/openssl/lib:/your/path/to/jemalloc/lib:/your/path/to/luajit/lib&#34;
</span></span><span class="line"><span class="cl"> PIDFile=/run/nginx/nginx.pid
</span></span><span class="line"><span class="cl"> RuntimeDirectory=nginx
</span></span><span class="line"><span class="cl"> RuntimeDirectoryMode=0755
</span></span><span class="line"><span class="cl"> ExecStartPre=/your/path/to/nginx -t
</span></span><span class="line"><span class="cl"> ExecStart=/your/path/to/nginx
</span></span><span class="line"><span class="cl"> ExecReload=/bin/kill -s HUP $MAINPID
</span></span><span class="line"><span class="cl"> ExecStop=/bin/kill -s QUIT $MAINPID
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gi">+CapabilityBoundingSet=CAP_NET_BIND_SERVICE
</span></span></span><span class="line"><span class="cl"><span class="gi">+AmbientCapabilities=CAP_NET_BIND_SERVICE
</span></span></span><span class="line"><span class="cl"><span class="gi"></span> PrivateTmp=true
</span></span><span class="line"><span class="cl"> Restart=always
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> [Install]
</span></span><span class="line"><span class="cl"> WantedBy=multi-user.target
</span></span></code></pre></td></tr></table>
</div>
</div><p>再次重新加载 systemd 配置并重启服务，问题完美解决。</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>RpathIssue<br/><a href="https://wiki.debian.org/RpathIssue">https://wiki.debian.org/RpathIssue</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Use of file capabilities disables LD_LIBRARY_PATH - Red Hat Bugzilla<br/><a href="https://bugzilla.redhat.com/show_bug.cgi?id=448594">https://bugzilla.redhat.com/show_bug.cgi?id=448594</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>shared libraries - Linux capabilities (setcap) seems to disable LD_LIBRARY_PATH - Stack Overflow<br/><a href="https://stackoverflow.com/questions/9843178/linux-capabilities-setcap-seems-to-disable-ld-library-path">https://stackoverflow.com/questions/9843178/linux-capabilities-setcap-seems-to-disable-ld-library-path</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    
    <item>
      <title>使用 systemd 管理 frpc 服务</title>
      <link>https://blog.triplez.cn/posts/using-systemd-manage-frpc-service/</link>
      <pubDate>Sat, 27 Jun 2020 14:26:07 +0000</pubDate>
      
      <guid>https://blog.triplez.cn/posts/using-systemd-manage-frpc-service/</guid>
      <description>&lt;p&gt;Life is short, I use systemd.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Life is short, I use systemd.</p>
<h2 id="前言">前言</h2>
<p>frp[1] 是著名的内网穿透软件，支持 TCP、UDP 协议，且只需简单配置服务端，通过编辑客户端配置即可完成内网穿透的功能。但是其只提供了二进制可执行文件，并没有将其打包，也就无法使用 systemd。而对于一个需要开机启动、失败拉起的基础功能来说，我们有对其通过 systemd 进行管理的需求，也就有了本文。</p>
<h2 id="注册-frpc-服务">注册 frpc 服务</h2>
<p>其实使用 systemd 来管理程序相当简单。只需要在 <code>/etc/systemd/system/</code> 下写一个 <code>*.service</code> 的文件注册即可。</p>
<p>在 <code>/etc/systemd/system/</code> 目录下新建 <code>frpc.service</code> ：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-0-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo touch /etc/systemd/system/frpc.service
</span></span></code></pre></td></tr></table>
</div>
</div><p>将以下内容填入至 <code>frpc.service</code> ：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-1-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-1"> 1</a>
</span><span class="lnt" id="hl-1-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-2"> 2</a>
</span><span class="lnt" id="hl-1-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-3"> 3</a>
</span><span class="lnt" id="hl-1-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-4"> 4</a>
</span><span class="lnt" id="hl-1-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-5"> 5</a>
</span><span class="lnt" id="hl-1-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-6"> 6</a>
</span><span class="lnt" id="hl-1-7"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-7"> 7</a>
</span><span class="lnt" id="hl-1-8"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-8"> 8</a>
</span><span class="lnt" id="hl-1-9"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-9"> 9</a>
</span><span class="lnt" id="hl-1-10"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-10">10</a>
</span><span class="lnt" id="hl-1-11"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-11">11</a>
</span><span class="lnt" id="hl-1-12"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-12">12</a>
</span><span class="lnt" id="hl-1-13"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-13">13</a>
</span><span class="lnt" id="hl-1-14"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-14">14</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[Unit]</span>
</span></span><span class="line"><span class="cl"><span class="na">Description</span><span class="o">=</span><span class="s">FRP Client Daemon</span>
</span></span><span class="line"><span class="cl"><span class="na">After</span><span class="o">=</span><span class="s">network.target</span>
</span></span><span class="line"><span class="cl"><span class="na">Wants</span><span class="o">=</span><span class="s">network.target</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[Service]</span>
</span></span><span class="line"><span class="cl"><span class="na">Type</span><span class="o">=</span><span class="s">simple</span>
</span></span><span class="line"><span class="cl"><span class="na">ExecStart</span><span class="o">=</span><span class="s">/path/to/your/frpc -c /path/to/your/frpc.ini</span>
</span></span><span class="line"><span class="cl"><span class="na">Restart</span><span class="o">=</span><span class="s">always</span>
</span></span><span class="line"><span class="cl"><span class="na">RestartSec</span><span class="o">=</span><span class="s">20s</span>
</span></span><span class="line"><span class="cl"><span class="na">LimitNOFILE</span><span class="o">=</span><span class="s">infinity</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[Install]</span>
</span></span><span class="line"><span class="cl"><span class="na">WantedBy</span><span class="o">=</span><span class="s">multi-user.target</span>
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><code>frpc.service</code> 的内容遵循 systemd 的配置格式[2][3]。</p>
</blockquote>
<p>保存后重载 systemd 配置：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-2-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo systemctl daemon-reload
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="通过-systemd-控制-frpc">通过 systemd 控制 frpc</h2>
<p>启动 frpc：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-3-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo systemctl start frpc
</span></span></code></pre></td></tr></table>
</div>
</div><p>停止 frpc：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-4-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo systemctl stop frpc
</span></span></code></pre></td></tr></table>
</div>
</div><p>查看 frpc 状态：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-5-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-5-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ systemctl status frpc
</span></span></code></pre></td></tr></table>
</div>
</div><p>将 frpc 设为开机启动：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-6-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo systemctl <span class="nb">enable</span> frpc
</span></span></code></pre></td></tr></table>
</div>
</div><p>取消 frpc 开机启动：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-7-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-7-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ sudo systemctl disable frpc
</span></span></code></pre></td></tr></table>
</div>
</div><p>使用方法与 systemd units [4]相同。</p>
<h2 id="references">References</h2>
<ol>
<li>fatedier/frp in GitHub
<a href="https://github.com/fatedier/frp">https://github.com/fatedier/frp</a></li>
<li>systemd.unit
<a href="https://www.freedesktop.org/software/systemd/man/systemd.unit.html">https://www.freedesktop.org/software/systemd/man/systemd.unit.html</a></li>
<li>systemd.service
<a href="https://www.freedesktop.org/software/systemd/man/systemd.service.html">https://www.freedesktop.org/software/systemd/man/systemd.service.html</a></li>
<li>systemd (Using units) - ArchWiki
<a href="https://wiki.archlinux.org/index.php/Systemd#Using_units">https://wiki.archlinux.org/index.php/Systemd#Using_units</a></li>
</ol>]]></content:encoded>
    </item>
    
  </channel>
</rss>
