欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 14_03 _bash脚本编程之十一(Linux启动流程之三) SysV服务脚本 有大用

id:5:initdefault


si::sysinit:/etc/rc.d/rc.sysinit

OS的初始化


/etc/rc.d/rc.sysinit 完成的任务

1,激活udev和selinux: (前200行,就不用读了,前面十几行还是可以看得懂的吧)

2,根据/etc/sysct.conf文件,来设定内核参数

3,设定系统时间

4,装载键映射

5,启用交换分区

6,设置主机名

7,根文件系统检测,并以读写方式重新挂载

8,激活RAID(及软RAID)和LVM设备 (额外的,除了根以外和其它的)

9,启用磁盘配额 (限定用户最多使用多少磁盘空间的,用处不大)

10,根据/etc/fstab,检查并挂载其它文件系统

11,清理过期的锁和PID文件



l0:0:wait:/etc/rc.d/rc 0

    rc0.d/

        K*        (K是kill的意思)

                stop

        S*        (S是start的意思)

                start


链接到 /etc/rc.d/init.d , /etc/init.d  这两个指的是同一个位置,后面是前面的链接

放到里面的脚本通通称为服务脚本 服务类脚本

    start 启动一个程序,或进程,一个程序可能关联多个进程,这些进程都可为称为服务类脚本


红帽遵循SysV风格

        /etc/rc.d/init.d

每一个脚本至少接受4个参数

      start stop restart status

 还有可能 reload|configtest                         这些都是属于SysV风格

    (reload不重启,重读配置文件,SIGHUP,1号信号)

    (configtest,检查配置文件中是不是有语法错误的)


有个命令 chkconfig : 能够指定SysV风格的这一类的服务类脚本,能够实现给它自动创建链接于rc#.d目录下

前提是这一类脚本必须有 chkconfig 和 description 这两行

       /etc/rc.d/init.d下的脚本都有这两行 这类脚本就靠这样两行能够实现成为系统服务的

   # chkconfig: 定义能够接受另外一个命令的控制,并自动的在对应的 rc#.d(rc0.d rc1.d等等)创建链接的 (而且K开头,S开头也能够通过一个命令来实现)  

                        # chkconfig: 345 95 5                                      (# chkconfig: 2345 95 05 ,# chkconfig: 345 28 72 )

                        # chkconfig: runlevels  SS KK

                                runlevels:  - (中短横) 表示没有一个级别默认为S*开头的链接:创建链接的时候,默认所有都是K*开头的

                        三组数字:            

                                    第一组 345 用来定义默认的启动的运行级别,在哪些级别下默认是启动的 默认设定为s ( start )的级别(345表示3,4,5级别下创建S开头的,其余的创建K开头的)

                                    第二组 95 用来定义启动的优先次序(SS两位)

                                    第一组 5  关闭的优先次序(KK两位,为什么这里只有一位?)

                当chkconfig命令来为此脚本在rc#.d目录创建链接时,runlevels  表示默认创建为S*开头的链接,除此之外的级别都默认创建为K*开头的链接  

                S后面的启动优先级为SS所表示的数字  K后面的关闭优先次序为KK所表示的数字


   # description::用于说明此脚本的简单功能的,反斜线 \ 续行 (内容太多时,需要续行) (一般一行不超过80个字符,否则某些图形化工具显示不出来)

看上去是注释,但我们的脚本会读取这两行 ,虽然是注释,但是chkconfig 会分析这两行



命令 chkconfig 

    chkconfig --list 列出当前系统上的所有服务 查看所有独立守护进程类服务的启动设定

            chkconfig --list SERVIE_NAME 只看某一个某一个服务


    想让某个脚本,比如自己建的myservice脚本,能够创建S*开头的链接,M*开头的链接,把myservice脚本先放到 init.d目录下 然后执行下面的一行命令,这样子就自动给脚本创建几个链接了

    chkconfig  --add SERVICE_NAME(服务名称或脚本名称)  表示把它加到服务列表中去,chkconfig 可以控制的服务中去

     chkconfig  --del SERVICE_NAME(服务名称或脚本名称)  移除服务,这样就能通通移除创建的链接文件

    chkconfig [ --level RUNLEVELS ] SERVICE_NAME {on|off}        修改服务的级别 

                --level RUNLEVELS 其实是可以省略的,如果省略的话,默认是2345,不是当前级别


像这类S开头,K开头的,在对应级别下能够实现启动和停止的这些服务 叫独立守护进程


/etc/rc.d/rc.local (/etc/rc.local):系统最后启动的一个服务,准确说,应该是执行的一个脚本



红帽5上    /etc/inittab的任务:

    1)设定默认运行级别

    2)运行系统初始化脚本

    3)运行指定运行级别对应的目录下的脚本:S*开头的start,K*开头的stop (应该是先运行K*开头,再运行S*开头的)

    4)设定Ctrl+Alt+Del组合键的操作

    5)定义UPS电源在电源故障/恢复时执行的操作

    6)启动虚拟终端 (2345级别)

    7)启动图形终端(5级别)

    

    

守护进程的类型:

    独立守护进程            (路边专卖店,)

    xinetd:超级守护进程 (它是独立守护进程):是需要关联至运行级别的,代理人,只有一个

                瞬时守护进程 (短暂守护进程):不需要关联至运行级别的  (大商场里面的一个店铺)

                        A(有人访问A时,由xinetd开启A,此人访问结束,再由xinetd关闭A)

                 瞬时守护进程 可以有多个

                (有人访问大商场里面的某一个店铺,保守叫醒此店铺服务,服务结束后,此店铺睡觉)

    

    

    

    





[root@localhost ~]# cd /etc/rc.d/init.d/

[root@localhost init.d]# ls

image.png

[root@localhost init.d]# head acpid anacron


[root@localhost init.d]# head acpid anacron atd autofs      都有共同的两行

image.png





# chkconfig 2345 77 22  (# chkconfig 2345 77 22 加起来一般等于99,不等于99也没关系,一般先开启的后关闭,后开启的先关闭;;;先开启的服务可能被其它服务所依赖,所以关闭时,是依赖的先关闭,再关闭这个服务)(造房子的时候,先砌的砖,到拆的时候,肯定是后拆)



[root@localhost ~]# vim myservice.sh

 

#!/bin/bash

#

# chkconfig: 2345 77 22

# description: Test Service

LOCKFILE=/var/lock/subsys/myservice


status(){

  if [ -e $LOCKFILE ]; then

    echo "Running..."

  else

    echo "Stopped.."

  fi

}


usage(){

echo "`basename $0` {start|stop|restart|status}"


}

case $1 in

start)

  echo "Starting..."

  touch $LOCKFILE;;

stop)

  echo "Stopping..."

  rm -f $LOCKFILE &>/dev/null;;

restart)

  echo "Restarting...";;

status)

  status;;

*)

  usage;;

esac

image.png

[root@localhost ~]# chmod +x myservice.sh

[root@localhost ~]# ./myservice.sh start

Starting...

[root@localhost ~]# ./myservice.sh status

Running...

[root@localhost ~]# ./myservice.sh stop

Stopping...

[root@localhost ~]# ./myservice.sh status

Stopped..

[root@localhost ~]#



每一个服务启动后,都给它一个锁 在  /var/lock/ 和  /var/lock/subsys/ 里面看看吧

service 服务 status 通过锁文件来检查状态的

[root@localhost ~]# ls /var/lock/

dmraid  irqbalance  iscsi  lvm  subsys

[root@localhost ~]# ls /var/lock/subsys/

acpid         gpm        iscsid         network     sendmail      xinetd

atd           haldaemon  kudzu          pcscd       smartd        yum-updatesd

auditd        hcid       local          portmap     sm-client

autofs        hidd       lvm2-monitor   rhsmcertd   sshd

avahi-daemon  ip6tables  messagebus     rpc.idmapd  syslog

bluetooth     iptables   microcode_ctl  rpc.statd   vmware-tools

crond         iscsi      netfs          sdpd        xfs

[root@localhost ~]#


复制到  /etc/rc.d/init.d/ 目录录 (不要.sh)

[root@localhost ~]# cp myservice.sh /etc/rc.d/init.d/myservice

[root@localhost ~]# chkconfig --list  

列出当前系统上的所有服务 ,每一个服务都有一个脚本名,而且显示在对应级别下

image.png

[root@localhost ~]# chkconfig --list network        (只看network,进1级别,网络服务是不是会启动的)

network         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

[root@localhost ~]#


[root@localhost ~]# cd /etc/rc.d/init.d/

[root@localhost init.d]# ls

image.png


[root@localhost init.d]# cd ..

[root@localhost rc.d]# ls

init.d  rc0.d  rc2.d  rc4.d  rc6.d     rc.sysinit

rc      rc1.d  rc3.d  rc5.d  rc.local

[root@localhost rc.d]# ls rc3.d/

image.png


[root@localhost rc.d]# find ./ -name "*myservice*"

./init.d/myservice

[root@localhost rc.d]#


加入服务(就创建了S和K开头的链接文件)

[root@localhost rc.d]# chkconfig --add myservice

[root@localhost rc.d]#

[root@localhost rc.d]# find ./ -name "*myservice*"

./rc6.d/K22myservice

./rc3.d/S77myservice

./rc1.d/K22myservice

./rc5.d/S77myservice

./rc2.d/S77myservice

./rc0.d/K22myservice

./init.d/myservice

./rc4.d/S77myservice

image.png

由 # chkconfig 和 #description 这两行 控制S(开启),K(关闭)的 

image.png

[root@localhost rc.d]#


移除了服务,自动创建的链接文件就没有了

[root@localhost rc.d]# chkconfig --del myservice

[root@localhost rc.d]# find ./ -name "*myservice*"

./init.d/myservice

[root@localhost rc.d]#



add 后 ,又有了链接文件

[root@localhost rc.d]# chkconfig --add myservice

[root@localhost rc.d]# find ./ -name "*myservice*"

./rc6.d/K22myservice

./rc3.d/S77myservice

./rc1.d/K22myservice

./rc5.d/S77myservice

./rc2.d/S77myservice

./rc0.d/K22myservice

./init.d/myservice

./rc4.d/S77myservice

[root@localhost rc.d]#


[root@localhost rc.d]# chkconfig --list myservice

myservice       0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

image.png


不用改脚本

直接

[root@localhost rc.d]# chkconfig --level 24 myservice off    (好像不修改init.d/myservice文件,重启时会失效?应该不会失效吧!)

[root@localhost rc.d]#

[root@localhost rc.d]# chkconfig --list myservice        (此时2和4都关闭的)

myservice       0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭


image.png


[root@localhost rc.d]# cd /etc/rc.d/init.d

[root@localhost init.d]# ls

image.png



[root@localhost init.d]# cd ../rc3.d

[root@localhost rc3.d]# ls   (看有没有rc.local 好像没有,不过没关系,马哥记错了)

image.png


[root@localhost rc3.d]# ll

image.pngimage.png


[root@localhost rc3.d]# cd ..

[root@localhost rc.d]# ls

init.d  rc0.d  rc2.d  rc4.d  rc6.d     rc.sysinit

rc      rc1.d  rc3.d  rc5.d  rc.local

[root@localhost rc.d]# ls -l /etc/rc.local

lrwxrwxrwx 1 root root 13 08-25 06:10 /etc/rc.local -> rc.d/rc.local

[root@localhost rc.d]#

image.png


rc.local 是系统启动执行到最后时要执行的脚本

(所有服务都启动完了,就执行它了)

不方便定义为服务的,又不会写脚本的,期望它开机能够自动执行的命令脚本,可以都写到这儿,它到最后,一定会执行一次的

[root@localhost rc.d]# vim rc.local

image.png


[root@localhost rc.d]# vim rc.local  加入这一行, 开机时自动执行

image.png



[root@localhost ~]# vim /etc/inittab

image.png


mingetty 启用终端 登录之前 mingetty命令都会启动一个终端

(ctrl+)alt (从F1到F6,可以切换,它们之间是一一对应的)

[root@localhost ~]# mingetty


[root@localhost ~]# mingetty tty7


[root@localhost ~]# mingetty tty1

[root@localhost ~]# 



配置下yum

image.png



[root@localhost ~]# cd  /etc/yum.repos.d/

[root@localhost yum.repos.d]# ls

cdrom.repo  rhel-debuginfo.repo-bak

[root@localhost yum.repos.d]# cat cdrom.repo

[Base]

name=RHEL5 CDROM Server

baseurl=file:///media/cdrom/Server

enabled=1

gpgcheck=0

[root@localhost yum.repos.d]#


[root@localhost yum.repos.d]# mount /dev/cdrom /media/cdrom/

mount: block device /dev/cdrom is write-protected, mounting read-only

[root@localhost yum.repos.d]#


[root@localhost yum.repos.d]# yum install xinetd -y

image.png



xinetd  启动后会有很多瞬时进程会被安装的

[root@localhost yum.repos.d]# chkconfig  --list xinetd

image.png

 chkconfig  --list xinetd    级别,它不会现在有效的,不会马上启动xinetd, 只是,下一次重启电脑的时候,才有效

[root@localhost yum.repos.d]# service xinetd start

启动 xinetd:                                              [确定]

[root@localhost yum.repos.d]#

[root@localhost yum.repos.d]# chkconfig --list


xinetd 管理的瞬时服务,没有级别的概念;但是xinetd本身是级别的概念

image.png


启动瞬时服务 不需要级别 (启动独立守护进程,也可以不需要级别,此时默认级别为2345,不是当前的系统开级的级别)

[root@localhost yum.repos.d]# chkconfig rsync on

[root@localhost yum.repos.d]#

[root@localhost yum.repos.d]# chkconfig --list

image.png

普通分类: