<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://www.bigdick.live/feed_style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans">
    <tabi:metadata xmlns:tabi="https://github.com/welpo/tabi">
        <tabi:base_url>https:&#x2F;&#x2F;www.bigdick.live</tabi:base_url>
        <tabi:separator>
            •
        </tabi:separator>
        <tabi:about_feeds>这是Web Feed，又称为Atom Feed，把现在的网址复制到新闻阅读器即可订阅本站文章。造访「About Feeds」来了解更多资讯。</tabi:about_feeds>
        <tabi:visit_the_site>造访网站</tabi:visit_the_site>
        <tabi:recent_posts>近期文章</tabi:recent_posts>
        <tabi:last_updated_on>更新于 $DATE</tabi:last_updated_on>
        <tabi:default_theme></tabi:default_theme>
        <tabi:post_listing_date>date</tabi:post_listing_date>
        <tabi:current_section>区块链</tabi:current_section>
    </tabi:metadata><link rel="extra-stylesheet" href="https://www.bigdick.live/skins/black-orange.css?h=c64b7f81e34a143cd725" /><title>孙瑜 - 区块链</title>
        <subtitle>孙瑜的个人首页：生物信息、数据科学、软件工程，以及公开简历、项目和文章。</subtitle>
    <link href="https://www.bigdick.live/tags/qu-kuai-lian/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://www.bigdick.live/tags/qu-kuai-lian/" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2018-05-31T00:00:00+00:00</updated><id>https://www.bigdick.live/tags/qu-kuai-lian/atom.xml</id><entry xml:lang="zh-Hans">
        <title>如何优雅地在Linux操作系统下用CPU挖矿</title>
        <published>2018-05-31T00:00:00+00:00</published>
        <updated>2018-05-31T00:00:00+00:00</updated>
        <author>
            <name>孙瑜</name>
        </author>
        <link rel="alternate" href="https://www.bigdick.live/blog/wa-kuang-zh/" type="text/html"/>
        <id>https://www.bigdick.live/blog/wa-kuang-zh/</id>
        
            <content type="html">&lt;p&gt;这是一篇“散文”，记录一下最近用CPU挖矿的曲折的折腾过程。&lt;&#x2F;p&gt;
&lt;p&gt;首先先来BB一下动机：手里是有一台PC的，没错，你没看错，一台普通台式机，其实无法通过这件事为我带来任何收益，但是出于对区块链的浓厚兴趣，我出手了。&lt;&#x2F;p&gt;
&lt;p&gt;我瞄准的币种是&lt;a class=&quot;external&quot; rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;karbo.io&#x2F;&quot;&gt;Karbo&lt;&#x2F;a&gt;（卡博币），那么为什么选这个呢，因为很多币（比如比特币）用CPU已然挖不动了。随着全网算力的提升，一些热门币种陆陆续续被大量计算出来，现如今计算的难度越来越大，对应的挖矿设备已经经历了CPU -&amp;gt; GPU -&amp;gt; 专用矿机这个历程。我不是专门的挖矿大户，顶多算是兴趣爱好者，当然能从中获利我也很开心。这个币现在很贱，之前更贱。坦白讲，最近几个月的一些涨幅才让我对其升值有了一定的信心。虚拟货币现在很多，这里面存在一个矛盾：如果玩的人少，市场不活跃，币就没有价值；如果玩的人太多，矿工会大量涌入，之后就重复了比特币的历程，又是一般玩家玩不起的了（不信可以去试试，个体户买一台矿机，挖几年能挖出一枚比特币哦）。我认为Karbo刚刚处在这样一个合适的阶段，所以选择了它。&lt;&#x2F;p&gt;
&lt;p&gt;挖矿，首先要有一个钱包。钱包很容易弄，懒得写了。&lt;&#x2F;p&gt;
&lt;p&gt;然后就是一个很有趣的问题，挖矿，其实本质上就是算hash值。那么这个计算的程序，也就是挖矿程序用什么好呢？我搜索了一圈，似乎&lt;a class=&quot;external&quot; rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fireice-uk&#x2F;xmr-stak&quot;&gt;xmr-stak&lt;&#x2F;a&gt;还是比较科学的，支持CPU&#x2F;A卡&#x2F;N卡，支持Windows&#x2F;Linux&#x2F;macOS，支持的币种多，口碑也不错，算是挖矿程序里的佼佼者了。&lt;&#x2F;p&gt;
&lt;p&gt;很遗憾，截至我书写这篇日记的时候，软件的docker镜像并不可用，否则应该是很方便的。编译安装比较中规中矩，作者在文档里给出了常见的Linux distribution的对应命令，也不想多说了。重点谈一个坑：&lt;&#x2F;p&gt;
&lt;p&gt;国际惯例，挖矿工具的作者，是会从计算过程中“抽水”的。一般来讲，默认会抽2%，xmr-stak也是采用了这个值。这个2%，其实就是每计算100分钟，其中有两分钟是为作者的钱包计算&#x2F;提交hash值，可以理解为是一种持续捐献、鼓励和支持作者继续开发的团结友爱的行为。作者在此处体现出了充分的人道主义精神，指出了源码中控制捐献比例的变量的位置，允许用户在编译程序之前自行修改：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fireice-uk&#x2F;xmr-stak&#x2F;blob&#x2F;c0ab1734332d6472225d8ac7394f6fcba71aabc9&#x2F;xmrstak&#x2F;donate-level.hpp&quot;&gt;xmrstak&#x2F;donate-level.hpp&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;constexpr double&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fDevDonationLevel &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2.0&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 100.0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;一个中规中矩的double类型常量，看起来没什么不妥。可是这个时候我的好奇心膨胀了，我很关心作者是如何实现这个捐献的逻辑的。另外也有一个疑问：对于完全不捐献的人，会怎样处理，真的颗粒无收吗？假如人人都在编译之前手动修改了源码中这个常量的值为0.0，那么程序岂不是白写了…&lt;&#x2F;p&gt;
&lt;p&gt;于是我搜索了整个代码仓库内含有&lt;code&gt;fDevDonationLevel&lt;&#x2F;code&gt;常量的代码，发现了一些端倪。先看这一部分：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fireice-uk&#x2F;xmr-stak&#x2F;blob&#x2F;26a5d65f12b2f19a0a3ece39a2bc64718796367b&#x2F;xmrstak&#x2F;misc&#x2F;executor.hpp&quot;&gt;xmrstak&#x2F;misc&#x2F;executor.hpp&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; Dev donation time period in seconds. 100 minutes by default.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;&#x2F;&#x2F; We will divide up this period according to the config setting&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;constexpr static size_t&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; iDevDonatePeriod &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 100&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 60&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;inline bool&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; is_dev_time&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;    &#x2F;&#x2F;Add 2 seconds to compensate for connect&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-storage z-type&quot;&gt;    constexpr size_t&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; dev_portion &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;= static_cast&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;size_t&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;double&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;iDevDonatePeriod&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fDevDonationLevel &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;dev_portion &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt; &#x2F;&#x2F;No point in bothering with less than 10s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-false&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;get_timestamp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;()&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; dev_timestamp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; %&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; iDevDonatePeriod &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;iDevDonatePeriod &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; dev_portion&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;is_dev_time()&lt;&#x2F;code&gt;是一个返回值为bool类型的函数。作者将每100分钟看作一份，然后从中抽出以百分比计数的若干分钟来作为捐献。这里计算了一个&lt;code&gt;dev_portion&lt;&#x2F;code&gt;变量：&lt;code&gt;iDevDonatePeriod&lt;&#x2F;code&gt;常量将这一百分钟换算为秒，之后将其与&lt;code&gt;fDevDonationLevel&lt;&#x2F;code&gt;（用户决定的捐献比例）相乘，再加2（姑且可以认为这是为了方便计算，小数点是为了方便double类型相加）。然后我留意到下面有一个&lt;code&gt;if&lt;&#x2F;code&gt;分支，对于这个值小于12（每100分钟，也就是6000秒内，捐献给作者的计算时间低于10，因为之前加了2），函数将直接返回一个&lt;code&gt;false&lt;&#x2F;code&gt;。那么这个&lt;code&gt;false&lt;&#x2F;code&gt;的返回值又有什么用呢？我继续搜索了调用函数&lt;code&gt;is_dev_time()&lt;&#x2F;code&gt;的代码，发现了这样&lt;a class=&quot;external&quot; rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fireice-uk&#x2F;xmr-stak&#x2F;blob&#x2F;c0ab1734332d6472225d8ac7394f6fcba71aabc9&#x2F;xmrstak&#x2F;misc&#x2F;executor.cpp&quot;&gt;一处&lt;&#x2F;a&gt;，看完作者复杂的矿池切换逻辑，瞬间觉得后背一凉，想了下还是保留一点“良知”，适当调低了捐献比例（我是觉得2%有点高），编译，通过。&lt;&#x2F;p&gt;
&lt;p&gt;运行的时候，开始遇到了错误：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MEMORY ALLOC FAILED: mmap failed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这个好说，只要&lt;code&gt;sudo sysctl -w vm.nr_hugepages=128&lt;&#x2F;code&gt;就解决了。&lt;&#x2F;p&gt;
&lt;p&gt;万事俱备，只欠开挖。开挖之前，是想把进程做点手脚的。理由很简单，被人发现在挖矿就不好了，就变成了挖社会主义墙脚，薅社会主义羊毛。想隐藏进程，首先就要深刻理解常见进程查看工具，比如&lt;code&gt;top&lt;&#x2F;code&gt;、&lt;code&gt;ps&lt;&#x2F;code&gt;和&lt;code&gt;lsof&lt;&#x2F;code&gt;这些的原理。这里要用到一个超强的系统挖掘工具，叫做&lt;code&gt;sysdig&lt;&#x2F;code&gt;，它不仅仅在监控细节上更“深入”，甚至还能对容器（比如docker）等进行监控。使用&lt;code&gt;sysdig&lt;&#x2F;code&gt;监控&lt;code&gt;ps&lt;&#x2F;code&gt;时可以看到&lt;code&gt;ps&lt;&#x2F;code&gt;的大概工作原理：&lt;&#x2F;p&gt;
&lt;p&gt;用一些底层的函数，比如&lt;code&gt;openat()&lt;&#x2F;code&gt;和&lt;code&gt;getdents()&lt;&#x2F;code&gt;去解析&lt;code&gt;&#x2F;proc&lt;&#x2F;code&gt;目录的内容。比如在终端内运行&lt;code&gt;ls &#x2F;proc&lt;&#x2F;code&gt;，可以看到如下输出：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;legacy-assets&#x2F;my-website&#x2F;img&#x2F;post_img&#x2F;proc%E7%9B%AE%E5%BD%95%E7%9A%84%E5%86%85%E5%AE%B9.png&quot; alt=&quot;&#x2F;proc目录内容&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;这些数字就是对应每个进程的PID。每个进程在创建伊始，都会在&lt;code&gt;&#x2F;proc&lt;&#x2F;code&gt;下生成这样的一个目录，里面保存了很多信息。如果你是一只生信狗，看这篇日记的时候就应该想到，当你提交了一条任务，跑了很久都没跑完，以至于你都不记得当初把它提交时用的命令行参数了，怎么办？别担心，只要&lt;code&gt;cat &#x2F;proc&#x2F;PID&#x2F;cmdline&lt;&#x2F;code&gt;就可以看到万恶♂之源（误）：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;legacy-assets&#x2F;my-website&#x2F;img&#x2F;post_img&#x2F;cmdline%E7%9A%84%E5%86%85%E5%AE%B9.png&quot; alt=&quot;cmdline的内容&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;看来这里52329这个进程，就是一个sftp服务。除此之外，还可以查看进程状态、一些统计信息等等。&lt;&#x2F;p&gt;
&lt;p&gt;然鹅，虽然知道了&lt;code&gt;ps&lt;&#x2F;code&gt;这些程序是这样的工作原理，但是其实&lt;code&gt;openat()&lt;&#x2F;code&gt;和&lt;code&gt;getdents()&lt;&#x2F;code&gt;也不是根源，它们也要调用更为底层的C标准库（&lt;code&gt;libc&lt;&#x2F;code&gt;），里面提供了两个函数：&lt;code&gt;opendir()&lt;&#x2F;code&gt;和&lt;code&gt;readdir()&lt;&#x2F;code&gt;。到目前为止，把进程藏起来大概可以有这样几个思路：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;对类似SELinux这样的子系统做手脚。但是并不推荐，首先不好改，其次，服务器管理员可能一早就睿智地把它关了。&lt;&#x2F;li&gt;
&lt;li&gt;把&lt;code&gt;top&lt;&#x2F;code&gt;、&lt;code&gt;ps&lt;&#x2F;code&gt;和&lt;code&gt;lsof&lt;&#x2F;code&gt;这些程序的二进制可执行文件改了。这个切实可行，但是你就要去改源码。有几个类似的工具，就改几次，它更新，你再去改…再编译。有点蠢。&lt;&#x2F;li&gt;
&lt;li&gt;改掉&lt;code&gt;libc&lt;&#x2F;code&gt;。既然大家都在用&lt;code&gt;libc&lt;&#x2F;code&gt;的&lt;code&gt;readdir()&lt;&#x2F;code&gt;，不如就一次性把这里改掉，让它查看不到某些进程在&lt;code&gt;&#x2F;proc&lt;&#x2F;code&gt;里面的内容就好了。&lt;&#x2F;li&gt;
&lt;li&gt;直接修改内核对诸如&lt;code&gt;getdents()&lt;&#x2F;code&gt;函数的调用方式。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;这里利用一下Linux的预加载动态链接库的特性。捣鼓一个假的&lt;code&gt;readdir()&lt;&#x2F;code&gt;函数出来，加入操作系统的预加载列表内。之后再调用系统的&lt;code&gt;readdir()&lt;&#x2F;code&gt;函数的时候，由于函数签名相同，早就已经被覆盖掉，是一个假的&lt;code&gt;readdir()&lt;&#x2F;code&gt;了。逻辑也很简单，发现进程名称和设定的一致，就&lt;a class=&quot;external&quot; rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gianlucaborello&#x2F;libprocesshider&#x2F;blob&#x2F;890e3cf3f8cf3d2edf214c7ac1275b7c3ced15a9&#x2F;processhider.c&quot;&gt;跳过&lt;&#x2F;a&gt;。这里借用一下人家的轮子：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 先克隆下来&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; clone git@github.com:gianlucaborello&#x2F;libprocesshider.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; libprocesshider&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 编译&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;make&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 把编译好的动态链接库放好&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; mv libprocesshider.so &#x2F;usr&#x2F;local&#x2F;lib&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 加入预加载列表&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-comment&quot;&gt;# 这一行要用root账户添加&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;usr&#x2F;local&#x2F;lib&#x2F;libprocesshider.so&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;etc&#x2F;ld.so.preload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;自此，随便挖，别人根本不知道电费流向了哪里。&lt;&#x2F;p&gt;
&lt;p&gt;本来昨天写到这是结束了的，然鹅我意识到一个蛋疼的问题。老子自己都查不到这个进程的PID，kill不掉啊！
只能用睿智的sysdig去解决了！于是&lt;code&gt;aurman -S sysdig&lt;&#x2F;code&gt;尝试安装，发现：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(1&#x2F;2) Install DKMS modules&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;==&amp;gt; Unable to install module sysdig&#x2F;0.21.0 for kernel 4.14.48-2-MANJARO: Missing kernel headers.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这个其实不影响…但是也确实可以&lt;code&gt;aurman -S linux414-headers&lt;&#x2F;code&gt;修复一下。
然后使用sysdig查看CPU占用最多的进程：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; sysdig -c topprocs_cpu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CPU%                Process             PID&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--------------------------------------------------------------------------------&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;100.03%             &amp;lt;NA&amp;gt;                10212&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;100.03%             &amp;lt;NA&amp;gt;                10197&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;100.03%             &amp;lt;NA&amp;gt;                10203&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;100.03%             &amp;lt;NA&amp;gt;                10204&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;100.03%             &amp;lt;NA&amp;gt;                10185&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;100.03%             &amp;lt;NA&amp;gt;                10189&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;100.03%             &amp;lt;NA&amp;gt;                10214&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;100.03%             &amp;lt;NA&amp;gt;                10196&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;100.03%             &amp;lt;NA&amp;gt;                10216&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;100.03%             &amp;lt;NA&amp;gt;                10206&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这里是比较迂回了…因为PID确实被隐藏了…但是也不用担心，kill掉一个就全死了…大刀一挥死一片鬼子啊…
舒服了舒服了…&lt;&#x2F;p&gt;
</content>
        </entry>
</feed>
