黄仁勋 發表於 2019-7-25 14:11:00

systemd - CentOS 7进程守护&监控

<div>
<h1></h1>
</div>
<div id="article_content" data-track-view="{&quot;mod&quot;:&quot;popu_307&quot;,&quot;con&quot;:&quot;,https://blog.csdn.net/hellocooper/article/details/53771125,&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_307&quot;,&quot;con&quot;:&quot;,https://blog.csdn.net/hellocooper/article/details/53771125&quot;}">
<div id="content_views">
<h2 id="需求">需求:</h2>
<p>运行环境为CentOS 7系统,我们开发了一个程序,需要在开机时启动它,当程序进程crash或者开机之后,守护进程立即拉起进程。</p>
<h2 id="解决方案">解决方案:</h2>
<p>使用CentOS 7中的init进程systemd</p>
<h2 id="systemd简介">systemd简介</h2>
<h4 id="linux-init-centos-systemd">Linux Init &amp; CentOS systemd</h4>
<p>Linux一直以来采用init进程。例如下面的命令用来启动服务:&nbsp;<br>$&nbsp;sudo /etc/init.d/apache2 start&nbsp;<br>或者\ $ service apache2 start</p>
<p>但是init有两个缺点:&nbsp;<br>1、启动时间长。Init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。(这也是CentOS5的主要特征)&nbsp;<br>2、启动脚本复杂。Init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这使得脚本变得很长而且复杂。</p>
<p>Init:&nbsp;<br>Centos 5 Sys init 是启动速度最慢的,串行启动过程,无论进程相互之间有无依赖关系。&nbsp;<br>Centos6 Upstart init 相对启动速度快一点有所改进。有依赖的进程之间依次启动而其他与之没有依赖关系的则并行同步启动。&nbsp;<br>Centos7 systemd 与以上都不同。所有进程无论有无依赖关系则都是并行启动(当然很多时候进程没有真正启动而是只有一个信号或者说是标记而已,在真正利用的时候才会真正启动。)</p>
<p>systemd为了解决上文的问题而诞生。它的目标是,为系统的启动和管理提供一套完整的解决方案。根据linux惯例,字母d是守护进程(daemon) 的缩写。Systemd名字的含义就是 守护整个系统。Centos 7里systemd代替了init,成为了系统的第一个进程。PID为1.其他所有的进程都是它的子进程。</p>
<p>systemd 是 Linux 下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。systemd 的特性有:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。</p>
<h2 id="使用demo">使用demo</h2>
<h3 id="step1-创建被监控脚本">Step1. 创建被监控脚本</h3>
<pre name="code"><code>$ cd ~
$ vim test_init_watch.sh</code></pre>
<p>//脚本任务:间隔一秒钟输出一个date时间戳到指定到指定文件</p>
<pre name="code"><code>#!/bin/bash

# test_init_watch.sh
while [ 1 ]
do
    echo `date` &gt;&gt; /home/cooper/log.txt
    sleep 1
done</code></pre>
<p>&nbsp;</p>
<pre name="code"><code>$ chmod 777 test_init_watch.sh</code></pre>
<p>//创建软链接/home/cooper/test_init_watch.sh =&gt;/usr/sbin/sysd-test</p>
<pre name="code"><code>$ sudo cd /usr/sbin
$ ln -sf /home/cooper/test_init_watch.sh sysd-test</code></pre>
<p>&nbsp;</p>
<h3 id="step2-创建服务文件设置init进程托管">Step2. 创建服务文件,设置init进程托管</h3>
<p>注意:</p>
<ul>
<li>systemd服务文件放置目录有系统和用户区分;系统(/usr/lib/systemd/system/)、用户(/usr/lib/systemd/user/)。</li>
<li>在开机中没有登陆情况下就能运行的程序,应该放置在系统目录中;反之则放在用户目录中</li>
</ul>
<p>//为了测试方便,把服务文件放在/usr/lib/systemd/system中(借鉴sshd.service):</p>
<pre name="code"><code>$ cd /usr/lib/systemd/system/sysd-test.service
$ cp sshd.service sysd-test.service   
$ vim sysd-test.service</code></pre>
<p>&nbsp;</p>
<p>// usr/lib/systemd/system/sysd-test.service</p>
<pre name="code"><code>
Description=sysd server daemon
Documentation=no
After=no
Wants=no


EnvironmentFile=no
ExecStart=/usr/sbin/sysd-test
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=1s


WantedBy=multi-user.target graphic.target      #相当于runlevel:2345</code></pre>
<p>// 激活开机启动。启用runlevel的2345级别</p>
<pre name="code"><code>$ systemctl enable sysd-test.service</code></pre>
<p>//等价于创建软链接(下面的命令不用执行)</p>
<pre name="code"><code>$ cd /etc/systemd/system/multi-user.target.wants
$ ln -sf /usr/lib/systemd/system/sysd-test.service sysd-test.service
$ cd /usr/lib/systemd/system/graphical.target.wants/
$ ln -sf /usr/lib/systemd/system/sysd-test.service sysd-test.service</code></pre>
<h2 id="step3-启动sysdtest">Step3. 启动sysd_test</h2>
<h3 id="使用命令">//使用命令:</h3>
<pre name="code"><code>systemctl sysd-test.service</code></pre>
<h3 id="启动">//启动</h3>
<pre name="code"><code>$ systemctl start sysd-test.service
$ pgrep sysd-test
$ pkill -9 sysd-test
$ pgrep sysd-test</code></pre>
<p>//会发现两次pgrep进程id不一样了,表示系统自动拉起了sysd-test</p>
<h3 id="停止">//停止</h3>
<pre name="code"><code>$ systemctl stop sysd-test.service<br><br></code></pre>
<h3><code>&nbsp;//查看进程树</code></h3>
<pre name="code"><code><img src="https://img2018.cnblogs.com/blog/420532/201907/420532-20190725141007657-420765899.png" alt=""></code></pre>
<p>&nbsp;</p>
</div>
</div>

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:sunsky303,转载请注明原文链接:https://www.cnblogs.com/sunsky303/p/11243927.html</p><br><br>
来源:https://www.cnblogs.com/sunsky303/p/11243927.html
頁: [1]
查看完整版本: systemd - CentOS 7进程守护&监控