一、概述
/etc/init.d目录下包含的脚本文件,在系统启动时或更改运行级别时由init进程执行。这些脚本文件以符号链接的形式放在/etc/rc?.d目录下。
在/etc/rc?.d目录下的符号链接文件的名字命名规则是:Smmscript
或者 Kmmscript 。
mm是两位数,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