Linux系统运行级别和init.d脚本

一、概述


    /etc/init.d目录下包含的脚本文件,在系统启动时或更改运行级别时由init进程执行。这些脚本文件以符号链接的形式放在/etc/rc?.d目录下。

    在/etc/rc?.d目录下的符号链接文件的名字命名规则是:Smmscript 或者 Kmmscriptmm是两位数,script是脚本的名字,这个名字和其指向在init.d目录下真正的脚本名字一致。如/etc/rc2.d/S12starteb 对应的 /etc/init.d/starteb。

    当init进程改变到一个运行级别n,rcn.d目录下的脚本就会被执行,首先,执行以K开头的脚本,脚本执行参数是stop,然后,执行以S开头的脚本,脚本执行参数是start,K表示杀死某项服务,而S代表开启某项服务。例如,我们从运行级别2切换到运行级别3,init进程就会首先执行rc3.d目录下所有以K开头的脚本,参数为stop,然后执行rc3.d目录下所有以S开头的脚本,参数为start。mm代表的两位数,用于决定执行这些脚本的顺序,数值越小,越先被执行。例如,K20脚本将会先于K30脚本执行。这被用于某些服务必须先于其他服务运行的情况。例如,bind服务必须先于inn服务运行,在这种情况下,bind的脚本数值就应该比inn服务的小,像这样:

/etc/rc2.d/S17bind /etc/rc2.d/S70inn

    有两个运行级别,0(halt)和6(reboot)有一些不同。在这两个运行级别中,以S开头的脚本仍然是在以K开头的脚本之后调用,但他们的参数全都是stop,而不是start。


二、书写脚本


    系统启动或者更改运行级别时需要开启或者关闭的服务,其脚本应该放置在/etc/init.d目录下,这些脚本可以接收一个参数,这个参数可以是:

        start 开启服务

        stop 关闭服务

        restart 如果服务在运行,关闭并重启服务;如果服务没有在运行,开启服务

        reload 不关闭或重启服务,但使得服务的配置重新加载

        force-reload 使得服务的配置重新加载如果服务支持的话,否则重启服务

 

    init.d目录下的所有脚本都应该支持start,stop,restart,force-reload参数,而reload参数是可选的。init.d目录下的所有脚本必须保证足够健壮,比如当某个服务正在运行的时候,调用start,它应该能够正确返回而且不会产生多个该服务的拷贝,还有当某服务不在的时候调用stop也不会出错。在init.d目录下的脚本中应该小心使用set -e。书写正确的init.d脚本必须接受各种各样的错误退出状态。通用的init.d函数库对于调用set -e不够安全,因而在init.d脚本中,尽量避免使用set -e,取而代之,分开检测每条命令的结果。

 

三、脚本示例


/etc/rc2.d/S12starteb -> /etc/init.d/starteb

 

#!/bin/sh
NAME=startwpa.sh
PATH=$PATH:/usr/local/sbin
start_it_up()
{
	#设备加电
	echo 1 > /sys/power/iwifi
	sleep 1
	NETIF=""
	DRIVER="ralink"
}

shut_it_down()
{
	echo 0 > /sys/power/iwifi
}

reload_it()
{}

case "$1" in
  start)
    start_it_up
  ;;
  stop)
    shut_it_down
  ;;
  status)
    status_of_proc
  ;;
  reload|force-reload)
    reload_it
  ;;
  restart)
    shut_it_down
    start_it_up
  ;;
  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|reload|restart|force-reload|status}" >&2
    exit 2
  ;;
esac
 

 

 

参考:http://www.debian.org/doc/debian-policy/#contents 

     9.3 System run levels and init.d scripts

你可能感兴趣的:(linux,Debian,脚本,UP)