centOS 6 服务管理与服务脚本
服务管理与服务脚本
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 on 或chkconfig NetworkManager off,这种方式默认启用或关闭2345模式下的服务。
接下来我们使用chkconfig NetworkManager on开启服务,既然我们将服务就开启了,那么在/etc/rc3.d/下面肯定有一个以S开头的相关服务这就意味着它开机就能启动。 
接下来,我们做一个小实验:
- 查看atd服务是否开启,若开启,关闭
- 删除掉/etc/rc3.d/下atd的软链接
- 创建一个数值靠后,并且是S开头的软链接
- 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 服务管理与服务脚本的更多相关文章
- RHEL 6 和 RHEL 7 的一些有关运行级别,服务管理,服务启动等方面的区别介绍
systemd是7中的新命令组,集成了service和chkconfig的功能.system命令可参考:https://www.cnblogs.com/ray-bk/p/10415173.html 运 ...
- centOS7服务管理与启动流程
centOS7服务管理与启动流程 centOS7启动流程 systemd简介 unit对象 unit类型 特性 service unit文件格式 service unit file文件通常由三部分组成 ...
- Linux系统服务管理 服务管理
Linux独立服务管理 启动服务 systemctl start 服务名称.service 设置开机自启动 systemctl enable 服务名称.service 停止开机自启动 systemct ...
- linux 学习 12 服务管理
第十二讲 Linux服务管理 12.1 Linux服务管理-服务分类 ——Linux服务 ----RPM包默认安装的服务 ————独立的服务 ————基于xinetd服务 ----源码包安装的服务 ...
- Linux基础学习(12)--Linux服务管理
第十二章——Linux服务管理 一.服务简介与分类 1.服务的分类: 注:独立的服务放在内存中(好处:响应的速率快,坏处:独立的服务越多,耗费的内存资源越多):xinetd服务本身是独立的,在内存中, ...
- linux的服务管理(centos6和Centos7)和网络管理(网卡配置),计划服务cron
服务和网络 管理 init ifcfg ens33 1.服务: Linux系统中提供的功能,统称为服务,如:at服务.cron服务.web服务.FTP服务.sshd服务等. 服务是由已经在运行的进程 ...
- 如何通过Azure Service Management REST API管理Azure服务
通过本文你将了解: 什么是Azure Service Management REST API 如何获取微软Azure 订阅号 如何获取Azure管理证书 如何调用Azure Service Manag ...
- 集群容器管理之swarm ---服务管理
服务管理 # 创建服务docker service create --replicas 1 --name hello busybox # docker service update --args &q ...
- (二)Linux实操之——网络配置、进程管理、服务管理、组管理、YUM
接上段 (一)Linux实操之——权限.任务调度.磁盘分区 4.网络配置 4.1 NAT模式的网络配置 目前我们采用的网络配置是NAT模式. windows下cmd通过 ipconfig 命令可以 ...
随机推荐
- JS对JSON的操作总结
对于前端完全是菜鸟,迫于无奈,工作中要用到JS,尤其对JSON的处理为多,网上搜了一下,所讲的基本雷同.所以把平时用的比较多的JSON处理方法总结了一下,权当加深记忆. 一.概述 JSON(JavaS ...
- dotnet使用Selenium执行自动化任务
如果要做百度文库,百度贴吧,百度知道签到,你,会怎么做?前不久我还会觉得这好像太麻烦了,now,soeasy. 自动化测试工具:Selenium Selenium是一个用于Web应用程序测试的工具.S ...
- 安装zsh后出现命令行无法识别已安装的node
安装zsh之后,在命令行输入 node -v,会出现 command not found: node. 出现原因是:使用bash输入终端指令识别得是~/.bash_profile,而安装zsh则无法识 ...
- openstack配置
参考林海峰老师的配置教程 http://blog.51cto.com/9161406/1839667
- OpenCV中phase函数计算方向场
一.函数原型 该函数参数angleInDegrees默认为false,即弧度,当置为true时,则输出为角度. phase函数根据函数来计算角度,计算精度大约为0.3弧度,当x,y相等时,angle ...
- myeclipse db browser 新建数据源
Myeclipse 新建数据源 一.打开myeclipse(打开了当我没说) 二.在window选项中找到show view ,点击other,输入db,选择DB Browser 三.在DB Brow ...
- org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML.问题思路
15:36:34,549 WARN DefaultListableBeanFactory:1416 - Bean creation exception on FactoryBean type chec ...
- python+selenium自动化软件测试(第7章):Page Object模式
什么是Page ObjectModel模式Page Objects是selenium的一种测试设计模式,主要将每个页面看作是一个class.class的内容主要包括属性和方法,属性不难理解,就是这个页 ...
- 深入理解HTTP协议—HTTP协议详解(真的很经典)
引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...
- 数据结构之R进制转换
废话不多说,直接上代码 #include <stdio.h> int exchange(int a) { char c='A'; if(a>=10) { printf("% ...