服务管理与服务脚本

 

linux服务

 

服务启动过程详解

在开机启动过程中,我们计算机的各种服务也会按照配置信息启动服务,那个我们的服务使如何启动的呢?我们以 init 3模式为例,进行说明:

上图中:rc 3 --> 意味着读取/etc/rc.d/rc3.d/下的内容,现在我们看看/etc/rc.d/rc3.d/下有什么东西。

在/etc/rc.d/rc3.d/目录下,我们看到全部都是软链接连接到/init.d/下的脚本。
我们可以通过脚本加状态的模式启用或关闭我们的某个服务:

K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务

S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

但是实际上它并不是按照数字排序的,而是按照字符串的大小排序的。

K开头的服务代表开机不启动
S开头的服务代表开机启动

所以我们在写服务脚本的时候,如果是依赖于某些服务的,我们最好能够将我们的脚本连接名排到我们的服务所依赖的服务软连接后面。

我们看一下,在启动计算机的过程中,init加载了一个脚本/etc/rc.d/rc,下面是这个脚本的一部分内容。

# First, run the KILL scripts.

for i in/etc/rc$runlevel.d/K*;do

# Check if the subsystem is already up.

subsys=${i#/etc/rc$runlevel.d/K??}

[-f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ]||continue

check_runlevel "$i"||continue

# Bring the subsystem down.

[-n "$UPSTART"]&& initctl emit --quiet stopping JOB=$subsys

$i stop

[-n "$UPSTART"]&& initctl emit --quiet stopped JOB=$subsys

done

# Now run the START scripts.

for i in/etc/rc$runlevel.d/S*;do

# Check if the subsystem is already up.

subsys=${i#/etc/rc$runlevel.d/S??}

[-f /var/lock/subsys/$subsys ]&&continue

[-f /var/lock/subsys/$subsys.init ]&&continue

check_runlevel "$i"||continue

# If we're in confirmation mode, get user confirmation

if["$do_confirm"="yes"];then

confirm $subsys

rc=$?

if["$rc"=""];then

continue

elif["$rc"=""];then

do_confirm="no"

fi

fi

update_boot_stage "$subsys"

# Bring the subsystem up.

[-n "$UPSTART"]&& initctl emit --quiet starting JOB=$subsys

if["$subsys"="halt"-o "$subsys"="reboot"];then

export LC_ALL=C

exec $i start

fi

$i start

[-n "$UPSTART"]&& initctl emit --quiet started JOB=$subsys

done

在上面的脚本中我们发现,计算机在启动服务过程中,会在对应的运行级别下,先关闭一部分服务,关闭玩服务之后才会再对应的运行级别下启动一些服务。

所以面图片中带有K开头的软链接程序,就相当于执行真正指向的脚本后面跟上stop,带有S开头的软链接程序,就相当于执行真正指向的脚本后面跟上start。
我们以autofs为例,作以说明:

[root@CT691 ~]#/etc/rc.d/init.d/autofs start

Starting automount: automount: program is already running.

[ OK ]

上述的效果其实和service autofs本质上是一样的:

[root@CT691 ~]#service autofs start

Starting automount: automount: program is already running.

[ OK ]

接下来,我们以一个简单的服务脚本为例,做一个简单的说明演示:
脚本:

#!/bin/bash

source /etc/rc.d/init.d/functions

if[ $ !="stop"]&&[ $ !="start"]&&[ $ !="restart"]&&[ $ !="status"];then

echo "The parameter must be start,stop,restart,status"

exit;

fi

if[ $ ="start"];then

if[-e /var/lock/subsys/$(basename $)];then

action "the `basename $0` has started!" false

else

touch /var/lock/subsys/$

action "the ` basename $0` start success" true

fi

elif[ $ ="stop"];then

if[-e /var/lock/subsys/$(basename $)];then

rm -rf /var/lock/subsys/$(basename $)

action "the `basename $0` has stopped!" true

else

action "the`basename $0` is not starting" false

fi

elif[ $ ="restart"];then

if[-e /var/lock/subsys/$(basename $)];then

rm -rf /var/lock/subsys/$(basename $)

action "the `basename $0` has stopped!" true

touch /var/lock/subsys/$

action "the ` basename $0` restart success" true

else

action "the`basename $0` is not starting" false

action "the`basename $0` is not starting" false

fi

elif[ $ ="status"];then

if[-e /var/lock/subsys/$(basename $)];then

echo -e "the \033[1;32;1m`basename $0`\033[0m is running"

else

echo -e "the \033[1;31;1m`basename $0`\033[0m has stopped!"

fi

fi

接下来,我们将这个脚本放到/etc/rc.d/init.d/中去,先试一下看是否有什么问题:

我们使用service试试:一样可以使用

现在这个脚本并不是开机就能运行的,我们将它做成服务,还需要进行一些改变。在linux上,有一个工具控制着计算机服务的开机是否运行:ntsysv命令
如下图所示,带星好的就是开机运行的服务,不带星号的就是开机不运行的服务

chkconfig命令

这个工具有一个不好的地方就是它只能改本模式下的服务的开机是否启动,不能改变其他模式下服务的开机启动,如果我想改5模式的,需要使用ntsysv --level=5,如果我们想改各个模式下的开机服务,如果使用这个方法一个一个该改,十分的不方便,所以,我们使用chkconfig命令

我们可以使用这个命令看到各个模式下的服务是否开启或关闭,我以上图的第一个服务为例,关闭在3,5模式下的开机服务,看看如何实现:

关闭成功。

更多的时候,我们会使用chkconfig NetworkManager onchkconfig NetworkManager off,这种方式默认启用或关闭2345模式下的服务。

接下来我们使用chkconfig NetworkManager on开启服务,既然我们将服务就开启了,那么在/etc/rc3.d/下面肯定有一个以S开头的相关服务这就意味着它开机就能启动。

接下来,我们做一个小实验:

  1.  查看atd服务是否开启,若开启,关闭
  2.  删除掉/etc/rc3.d/下atd的软链接
  3.  创建一个数值靠后,并且是S开头的软链接
  4.  chkconfig查看atd服务状态

我们看到,当我们创建一个S开头的软链接之后,它的开机服务状态就变成了on了。

接下来我们将刚才的testsrv.sh做成我们的服务脚本,要做服务脚本,还需要一点点的改动,我们需要在注释中加上一行#chkconfig: 35 96 03 35代表的含义是在3和5模式下开机启动,96代表S开头的编号,03代表K开头的编号。

现在还是没有服务启动的的,我们需要手动加上去:

现在,在3模式下他已经是可以开机启动的服务了,我们也可以现在手动改成在3模式下开机不启动的状态,我们只需要chkconfig --level 3 testsrv.sh off:

[root@CT691 init.d]#chkconfig --list testsrv.sh

testsrv.sh :off :off :off :on :off :on :off

[root@CT691 init.d]#chkconfig --level  testsrv.sh off

[root@CT691 init.d]#ls /etc/rc3.d/K03*

/etc/rc3.d/K03testsrv.sh

如果我们不想要这个服务,我们需要将这个服务给删除,删除的方法是:chkconfig --del testsrv.sh,删除服务后,文件并不会被删除,但是软链接会被删除。chkconfig --list也不能查询到。

 

非独立服务与xinetd进程

很多时候,一些服务我们平时用不到,有时候一年才用一次或者好几个月用一次,如果让该服务开机就跑起来就太过于浪费资源。我们需要再使用它的时候自动开启,这该如何实现呢?
我们上面的一个一个的服务就做独立服务,而非独立服务是有特定的服务进行代理监听端口,等等有访问时由特定服务通知该服务启动运行,这个特定的服务就是xinetd,我们也可以称它是超级守护进程。
Telnet服务就是一个非独立服务,它的使用需要依赖于xinetd,当我们使用yum安装该软件时,它会自动安装上xinetd,下面是我安装好的Telnet:

接下来我们启动该服务,在第一次安装后,首先启动xinetd,在启动telnet:

我们在启动服务后可以看看是谁在监听这着23端口:

接下来我们尝试使用Telnet连接该系统,然后再次查看是谁在监听端口:
 

当我们开始使用的时候,他就变成了由原服务来执行,这就是我们要说的非独立服务。

 

一个特殊的服务脚本

正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本
不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中

  • /etc/rc.d/rc.local在指定运行级别脚本后运行
  • 可以根据情况,进行自定义修改

centOS 6 服务管理与服务脚本的更多相关文章

  1. RHEL 6 和 RHEL 7 的一些有关运行级别,服务管理,服务启动等方面的区别介绍

    systemd是7中的新命令组,集成了service和chkconfig的功能.system命令可参考:https://www.cnblogs.com/ray-bk/p/10415173.html 运 ...

  2. centOS7服务管理与启动流程

    centOS7服务管理与启动流程 centOS7启动流程 systemd简介 unit对象 unit类型 特性 service unit文件格式 service unit file文件通常由三部分组成 ...

  3. Linux系统服务管理 服务管理

    Linux独立服务管理 启动服务 systemctl start 服务名称.service 设置开机自启动 systemctl enable 服务名称.service 停止开机自启动 systemct ...

  4. linux 学习 12 服务管理

      第十二讲 Linux服务管理 12.1 Linux服务管理-服务分类 ——Linux服务 ----RPM包默认安装的服务 ————独立的服务 ————基于xinetd服务 ----源码包安装的服务 ...

  5. Linux基础学习(12)--Linux服务管理

    第十二章——Linux服务管理 一.服务简介与分类 1.服务的分类: 注:独立的服务放在内存中(好处:响应的速率快,坏处:独立的服务越多,耗费的内存资源越多):xinetd服务本身是独立的,在内存中, ...

  6. linux的服务管理(centos6和Centos7)和网络管理(网卡配置),计划服务cron

    服务和网络 管理 init  ifcfg ens33 1.服务: Linux系统中提供的功能,统称为服务,如:at服务.cron服务.web服务.FTP服务.sshd服务等. 服务是由已经在运行的进程 ...

  7. 如何通过Azure Service Management REST API管理Azure服务

    通过本文你将了解: 什么是Azure Service Management REST API 如何获取微软Azure 订阅号 如何获取Azure管理证书 如何调用Azure Service Manag ...

  8. 集群容器管理之swarm ---服务管理

    服务管理 # 创建服务docker service create --replicas 1 --name hello busybox # docker service update --args &q ...

  9. (二)Linux实操之——网络配置、进程管理、服务管理、组管理、YUM

    接上段   (一)Linux实操之——权限.任务调度.磁盘分区 4.网络配置 4.1 NAT模式的网络配置 目前我们采用的网络配置是NAT模式. windows下cmd通过 ipconfig 命令可以 ...

随机推荐

  1. GBK和UTF8的区别

    GBK的文字编码是双字节来表示的,即不论中.英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1. UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中 ...

  2. Stream-快速入门Stream编程

    1.什么是流 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执 ...

  3. oracle语句批处理

    数据量有40万条,从一个对象table_01一条一条取数到对象table_02,如果用原始的 Statement Statmt =comm.createStatement(); String sql= ...

  4. CSS display使用

    .今天我们来分析一下display的一些用法,display样式在我们整个CSS设置中,非常重要,掌握好display,才能有效的解决CSS布局的问题,在理解display之前,我们先了解两个概念:块 ...

  5. hdu 6068--Classic Quotation(kmp+DP)

    题目链接 Problem Description When online chatting, we can save what somebody said to form his ''Classic ...

  6. Express异步进化史

    1.导言 在 Javascript 的世界里,异步(由于JavaScript的单线程运行,所以JavaScript中的异步是可以阻塞的)无处不在. Express 是 node 环境中非常流行的Web ...

  7. 全平台轻量级 Verilog 编译器 & 仿真环境

    一直苦于 modelsim 没有Mac版本,且其体量过大,在学习verilog 时不方便使用. 终于找到一组轻量级且全平台 ( Linux+Windows+macOS ) 的编译仿真工具组. Icar ...

  8. UCOS-II学习记录

    本文主要记录使用UCOS II的相关内容.包括如何完成第一个UCOS II应用程序,和如何创建任务,如何获取系统时间,和利用i3086 驱动完成时间获取,屏幕显示,按键驱动,信号量等内容. UCOS- ...

  9. NHibernate教程(20)——二级缓存(上)

    本节内容 引入 介绍NHibernate二级缓存 NHibernate二级缓存提供程序 实现NHibernate二级缓存 结语 引入 上一篇我介绍了NHibernate内置的一级缓存即ISession ...

  10. c# List集合中First、Last、Single方法使用

    操作符 如果源序列是空的 源序列只包含一个元素 源序列包含多个元素 First 抛异常 返回该元素 返回第一个元素 FirstOrDefault 返回default(TSource) 返回该元素 返回 ...