<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Life blog</title>
    <description>Every failure is leading towards success.</description>
    <link>https://91tl.top/</link>
    <atom:link href="https://91tl.top/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Wed, 29 May 2019 03:09:42 +0000</pubDate>
    <lastBuildDate>Wed, 29 May 2019 03:09:42 +0000</lastBuildDate>
    <generator>Jekyll v3.8.5</generator>
    
      <item>
        <title>Linux 假死现象</title>
        <description>&lt;h2 id=&quot;什么是假死现象&quot;&gt;什么是假死现象&lt;/h2&gt;

&lt;p&gt;所谓假死现象，是指 Linux 内核 Alive，但是其上的某个或所有操作的响应变得很慢的现象。&lt;/p&gt;

&lt;p&gt;具体比较常见的现象有如下几种：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;能 Ping 通访问的服务器。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;系统负载非常的高。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;SSH 不能登陆或者登陆比较慢。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;服务器上提供的服务都不能正常响应，比如：不能访问系统上部署的 Web 服务器所提供的页面。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;在系统上做任何其它操作都没有反应或者反应较慢。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;假死现象并不是经常出现&quot;&gt;假死现象并不是经常出现&lt;/h2&gt;

&lt;p&gt;Linux 作为一个多任务操作系统，要把系统忙死，忙到 SSH 都连不上去也不是那么容易的。尤其是现在的系统还有 FD 保护、进程数保护、最大内存保护之类的机制。&lt;/p&gt;

&lt;p&gt;你可以尝试 Fork 很多进程，系统会变得很慢，但是 SSH 通常还是能连上去的；你可以尝试分配很多内存，但是内存多到一定程度 Linux 的 OOM 机制的 Killer 进程就会杀掉你的进程，来保证其它服务能正常工作。&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;假死现象是如何出现的&quot;&gt;假死现象是如何出现的&lt;/h2&gt;

&lt;p&gt;有一个确定可以把系统搞成假死的办法是：主进程分配固定内存，然后不停的 Fork，并且在子进程里面 Sleep(100)。&lt;/p&gt;

&lt;p&gt;也就是说，当主进程不停 Fork 的时候，很快会把系统的物理内存用完。当物理内存不足时候，系统会开始使用 Swap。那么当 Swap 不足时会触发 OOM 机制的 Killer 进程来杀掉多余进程。&lt;/p&gt;

&lt;p&gt;当 OOM 机制的 Killer 进程杀掉了子进程，主进程会立刻 Fork 新的子进程，并再次导致内存用完并再次触发 OOM 机制的 Killer 进程杀掉子进程，于是就进入死循环。而且 OOM Killer 进程是系统底层优先级很高的内核线程，此时也参与到这个死循环中，长此以往系统资源就会被消耗殆尽。假死现象是如何出现的&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;系统出现假死现象后为何还能-ping-通但又无法建立新的网络连接&quot;&gt;系统出现假死现象后，为何还能 Ping 通但又无法建立新的网络连接&lt;/h2&gt;

&lt;p&gt;系统出现假死现象后，服务器还可以 Ping 通，但是无法建立新的网络连接。比如：SSH 无法连上去。这是由于 Ping 是在 Linux 系统底层 ( Kernel )处理的，并没有参与进程调度。而 SSHD 是要参与进程调度，但是优先级没 OOM 机制的 Killer 进程高。这样就会一直得不到系统调度，从而始终无法正确的提供服务来与 SSH 客户端建立新的连接。&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;linux-出现假死现象我们应该怎么办&quot;&gt;Linux 出现假死现象，我们应该怎么办?&lt;/h2&gt;

&lt;p&gt;为什么要费那么大的力气把服务器搞死呢？我们知道假死是怎么产生的即可，这样可以针对假死的原因进行预防。 其实假死的情况很少发生，通常只有代码出现 Bug 很多的情况或者某个服务进程未正确配置的情况下才会出现。&lt;/p&gt;

&lt;p&gt;建议使用 nice 命令将 SSHD 的进程优先级调高，这样当系统内存紧张时，还能勉强登陆服务器进行调试，然后分析故障。&lt;/p&gt;
</description>
        <pubDate>Mon, 19 Nov 2018 00:00:00 +0000</pubDate>
        <link>https://91tl.top/2018/11/19/%E8%B0%88%E8%B0%88-Linux-%E5%81%87%E6%AD%BB%E7%8E%B0%E8%B1%A1/</link>
        <guid isPermaLink="true">https://91tl.top/2018/11/19/%E8%B0%88%E8%B0%88-Linux-%E5%81%87%E6%AD%BB%E7%8E%B0%E8%B1%A1/</guid>
        
        <category>Linux</category>
        
        
      </item>
    
      <item>
        <title>supervisor报错supervisor error (spawn error)</title>
        <description>&lt;p&gt;这几天部门里同事做一个镜像的迭代测试，需要我收集镜像里生成的日志。所以我在镜像里安装filebeat去收集日志写入kafka。&lt;/p&gt;

&lt;p&gt;轻车熟路的在Dockerfile里配好了supervisor的配置，就自信满满的打了镜像，去测试了。&lt;/p&gt;

&lt;p&gt;结果过后去看时，执行命令supervisorctl，结果发现如下图报错：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2019/05/08/5cd276d988c0a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ps -ef |grep filebeat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;发现filebeat服务进程存在。&lt;/p&gt;

&lt;p&gt;这时候检查supervisor的日志，发现没有报错。检查filebeat的服务日志也没有报错，这下就只能求助google了。google了会发现别人的博客里，日志里都有报错，所以和
我不一样。所以就去查了supervisor的官网。发现了如下：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2019/05/08/5cd27635e67dd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;意思是supervisor 的sub_programname需要放在前台运行，supervisor是父进程，它创建的每一个子进程监听管理的进程，通过SIGCHLD信号得知管理的进程死亡。所以管理的
进程不能使用daemon模式。所以你在配置文件里的common必须是运行在前台的命令。&lt;/p&gt;

&lt;p&gt;最后我编了个脚本，死循环的每秒监听服务，用supervisor去监听脚本运行。&lt;/p&gt;

&lt;p&gt;希望对大家能有帮助！&lt;/p&gt;
</description>
        <pubDate>Mon, 19 Nov 2018 00:00:00 +0000</pubDate>
        <link>https://91tl.top/2018/11/19/supervisor%E6%8A%A5%E9%94%99supervisor-error-(spawn-error)/</link>
        <guid isPermaLink="true">https://91tl.top/2018/11/19/supervisor%E6%8A%A5%E9%94%99supervisor-error-(spawn-error)/</guid>
        
        <category>报错</category>
        
        <category>supervisor</category>
        
        
      </item>
    
      <item>
        <title>Git指令整理</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;随便整理的一些自用的Git指令&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;github创建仓库提示代码&quot;&gt;GitHub创建仓库提示代码&lt;/h1&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;echo &quot;# 项目名&quot; &amp;gt;&amp;gt; README.md
git init
git add README.md
git commit -m &quot;first commit&quot;
git remote add origin git@github.com:qiubaiying/项目名.git
git push -u origin master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;若仓库存在直接push&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git remote add origin git@github.com:qiubaiying/test.git
git push -u origin master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;常用操作&quot;&gt;常用操作&lt;/h1&gt;

&lt;h4 id=&quot;创建仓库初始化&quot;&gt;创建仓库（初始化）&lt;/h4&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;在当前指定目录下创建
git init

新建一个仓库目录
git init [project-name]

克隆一个远程项目
git clone [url]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;添加文件到缓存区&quot;&gt;添加文件到缓存区&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;添加所有变化的文件
 	git add .

添加名称指定文件
git add text.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;配置&quot;&gt;配置&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;设置提交代码时的用户信息
git config [--global] user.name &quot;[name]&quot;
git config [--global] user.email &quot;[email address]&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;提交&quot;&gt;提交&lt;/h4&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;提交暂存区到仓库区
git commit -m &quot;msg&quot;

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化，直接到仓库区
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v

# 使用一次新的commit，替代上一次提交
# 如果代码没有任何新变化，则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit，并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;远程同步&quot;&gt;远程同步&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# 下载远程仓库的所有变动
$ git fetch [remote]

# 显示所有远程仓库
$ git remote -v

# 显示某个远程仓库的信息
$ git remote show [remote]

# 增加一个新的远程仓库，并命名
$ git remote add [shortname] [url]

# 取回远程仓库的变化，并与本地分支合并
$ git pull [remote] [branch]

# 上传本地指定分支到远程仓库
$ git push [remote] [branch]

# 强行推送当前分支到远程仓库，即使有冲突
$ git push [remote] --force

# 推送所有分支到远程仓库
$ git push [remote] --all
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;分支&quot;&gt;分支&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 列出所有本地分支和远程分支
$ git branch -a

# 新建一个分支，但依然停留在当前分支
$ git branch [branch-name]

# 新建一个分支，并切换到该分支
$ git checkout -b [branch]

# 新建一个分支，指向指定commit
$ git branch [branch] [commit]

# 新建一个分支，与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]

# 切换到指定分支，并更新工作区
$ git checkout [branch-name]

# 切换到上一个分支
$ git checkout -

# 建立追踪关系，在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]

# 合并指定分支到当前分支
$ git merge [branch]

# 选择一个commit，合并进当前分支
$ git cherry-pick [commit]

# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;标签tags&quot;&gt;标签Tags&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;添加标签 在当前commit
git tag -a v1.0 -m 'xxx' 

添加标签 在指定commit
git tag v1.0 [commit]

查看
git tag

删除
git tag -d V1.0

删除远程tag
git push origin :refs/tags/[tagName]

推送
git push origin --tags

拉取
git fetch origin tag V1.0

新建一个分支，指向某个tag
git checkout -b [branch] [tag]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;查看信息&quot;&gt;查看信息&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# 显示有变更的文件
$ git status

# 显示当前分支的版本历史
$ git log

# 显示commit历史，以及每次commit发生变更的文件
$ git log --stat

# 搜索提交历史，根据关键词
$ git log -S [keyword]

# 显示某个commit之后的所有变动，每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s

# 显示某个commit之后的所有变动，其&quot;提交说明&quot;必须符合搜索条件
$ git log [tag] HEAD --grep feature

# 显示某个文件的版本历史，包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

# 显示指定文件相关的每一次diff
$ git log -p [file]

# 显示过去5次提交
$ git log -5 --pretty --oneline

# 显示所有提交过的用户，按提交次数排序
$ git shortlog -sn

# 显示指定文件是什么人在什么时间修改过
$ git blame [file]

# 显示暂存区和工作区的差异
$ git diff

# 显示暂存区和上一个commit的差异
$ git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

# 显示今天你写了多少行代码
$ git diff --shortstat &quot;@{0 day ago}&quot;

# 显示某次提交的元数据和内容变化
$ git show [commit]

# 显示某次提交发生变化的文件
$ git show --name-only [commit]

# 显示某次提交时，某个文件的内容
$ git show [commit]:[filename]

# 显示当前分支的最近几次提交
$ git reflog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;撤销&quot;&gt;撤销&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# 恢复暂存区的指定文件到工作区
$ git checkout [file]

# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]

# 恢复暂存区的所有文件到工作区
$ git checkout .

# 重置暂存区的指定文件，与上一次commit保持一致，但工作区不变
$ git reset [file]

# 重置暂存区与工作区，与上一次commit保持一致
$ git reset --hard

# 重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变
$ git reset [commit]

# 重置当前分支的HEAD为指定commit，同时重置暂存区和工作区，与指定commit一致
$ git reset --hard [commit]

# 重置当前HEAD为指定commit，但保持暂存区和工作区不变
$ git reset --keep [commit]

# 新建一个commit，用来撤销指定commit
# 后者的所有变化都将被前者抵消，并且应用到当前分支
$ git revert [commit]

# 暂时将未提交的变化移除，稍后再移入
$ git stash
$ git stash pop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;其他&quot;&gt;其他&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# 生成一个可供发布的压缩包
$ git archives
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Wed, 15 Feb 2017 00:00:00 +0000</pubDate>
        <link>https://91tl.top/2017/02/15/Git%E6%8C%87%E4%BB%A4%E6%95%B4%E7%90%86/</link>
        <guid isPermaLink="true">https://91tl.top/2017/02/15/Git%E6%8C%87%E4%BB%A4%E6%95%B4%E7%90%86/</guid>
        
        <category>Git</category>
        
        
      </item>
    
  </channel>
</rss>
