服务管理与服务脚本

 

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. fs模块(二)

    1. renameSync 01. 重命名 02. 移动文件夹,相当于剪切作用 var fs = require('fs'); // 01 文件重命名 var renameFile = (oldFil ...

  2. spring boot整合Thymeleaf的那些坑(spring boot 学习笔记之四)

    这里简单记录一下Thymeleaf配置和使用的步骤 1.修改pom文件,添加依赖 <dependency> <groupId>org.springframework.boot& ...

  3. STL空间配置器

    1.什么是空间配置器? 空间配置器负责空间配置与管理.配置器是一个实现了动态空间配置.空间管理.空间释放的class template.以内存池方式实现小块内存管理分配.关于内存池概念可以点击:内存池 ...

  4. pdf.js跨域问题的分析

    最近在做公司业务时,需要在线浏览pdf.在现代浏览器中, 均可直接浏览pdf文件,无兼容性问题.但公司的业务线需要支持到ie8. 经过自己的搜索调研, pdf.js比较适合.pdf.js兼容到ie9, ...

  5. pandas数据分析(数据结构)

    本文主要从以下两个方向对pandas的数据结构进行展开,分别为Series和DataFrame(对应的分别是系列与numpy中的一维数组和二维数组) 1.首先从Series讲起,主要介绍Series的 ...

  6. 基本元件库(Basic)

  7. 归并排序Java实现

    package practice; import edu.princeton.cs.algs4.*; /* * 归并排序 * 时间复杂度O(NlgN) N为数组长度 * 归并排序在小数组上表现并不好可 ...

  8. Grails笔记三:完整的文件上传实例

    文件上传在web应用中是比较普遍的,相对于使用jsp等技术实现文件上传,Grails的文件上传着实让人喜爱,因为极其简单,让人看一遍就容易轻松记住!不多说,实例如下: 假设已有一个名为uploadFi ...

  9. C++学习日记(一)————类与对象

     C++远征之封装篇(上)笔记 所有内容都是听课笔记,愿课堂视频如下: C++远征之封装篇(上)-慕课网http://www.imooc.com/learn/382 类和对象 1 什么是类,什么是对象 ...

  10. CSS背景效果

    前面的话 本文将详细介绍CSS背景效果 条纹背景 [双条纹背景] background:linear-gradient(#fb3 50%, #58a 50%); background-size: 10 ...