Linux系统一共有7个运行级别:0-6.其中0是关机、3是多用户有网络模式、5是图形

界面、6是重新启动。系统启动时,在进行一些必要的初始化工作后,就会根据/etc/inittab

里的配置决定运行级别,例如inittab里的配置是id:3:initdefault:,3就说明系统默认的运

行级别是3。系统就会自动去加载/etc/rc.d/rc3.d里面定义的服务。但是系统共有7个运行级

别,而有的服务需要在多个运行级别里都要加载,如果每个服务都在/etc/rc.d/rcN.d里直接

定义的话,就会出现多个副本,不便于维护,所以linux里的服务一般都定义

在/etc/rc.d/init.d里面,而/etc/rc.d/rcN.d里面只维护一个连接。在/etc/rc.d/rcN.d里

面我们会看到两种格式的文件名,一种是以KNN开头的,一种是以SNN开头的,后面的内容就

和/etc/rc.d/init.d定义的服务名相同了。K代表关闭(kill),即系统启动时不启动该服务,S

代表启动(start),NN代表启动顺序,序号越小,越早启动。/etc/rc.d/rcN.d里面的链接文

件可由chkconfig命令自动创建,不需要手动创建,当然也可以手动创建。下面我们创建一服

务,该服务就是在系统启动时向/tmp/myservice.log追加一句话,我们命名为myservice,具

体步骤如下:
#cd /etc/rc.d/init.d
#touch myservice
#chmod u+x myservice
myservice的内容为:
#!/bin/bash
#chkconfig:345 66 33
#descriptioin:this is my service
echo "My service is auto runned at `date`">>/tmp/myservice.log

注意#chkconfig:345 66 33必须有,其中345表示当系统运行在345级别时自动启动该服务,

在其他级别不启动;66表示启动的顺序,33表示关闭顺序,数字越小越早执行。
#description:也必须有,否则我们接下来运行的chkconfig会报错。
然后我们运行
#chkconfig --add myservice
服务到此定义完毕,下次启动时,我们会在/tmp/myservice.log看到一句话:
My service is auto runned at Thu Mar 17 06:02:59 CST 2011
这表明我们的服务在系统启动时被调用了。
让我们看一下 chkconfig --add myservice到底做了什么事情。其实事情的真相很简单,让

我们进入/etc/rc.d/rc3.d
#cd /etc/rc.d/rc3.d ---进入 3,4,5都一样,这代表着我们在myservice文件

#chkconfig:345 66 33 里的345。
#ls *myservice 我们会看到S66myservice,用file命令查看下文件格式,我们会发现它是一

个链接到/etc/rc.d/init.d/myservice 的一个连接文件。正如前面所说,S代表启动。
在进入/etc/rc.d/rc1.d,这里面会有一K66myservice,表示服务在这个级别不启动。

chkconfig做的事情其实就这么简单,我们也可以手动来完成这些事情。本人比较懒,更何况

还有更重要的事情要做,所以就不在详述。

下面,下面,下面我们要做什么呢?。。。

服务在系统启动时是自动加载了,但是它什么时候关闭呢?关闭它时怎么调用呢?

查看/etc/rc.d/rc0.d/S00killall可以发现,系统在关闭时,会去/var/lock/subsys里查找

,如果找到服务名,就会运行下面命令/etc/init.d/servicename stop 这条命令。
所以如果我们希望系统关闭时同样调用我们服务的关闭函数,我们就必须在服务启动时,

在/var/lock/subsys里创建一和我们服务名相同的文件。
修改/etc/rc.d/init.d/myservice如下:

#!/bin/bash
#chkconfig:345 66 33
#descriptioin:this is my service
start()
{
 echo "My service is auto runned at `date`">>/tmp/myservice.log
 touch /var/lock/subsys/myservice
}
stop()
{
 echo "My service is auto stopped at `date`">>/tmp/myservice.log
 rm -f /var/lock/subsys/myservice
}
status()
{
 echo " What do you want to do"
}

case "$1" in
start)
 start
 ;;
stop)
 stop
 ;;
status)
 status
 ;;
restart|reload)
 stop
 start
 ;;
*)
exit 1
esac
exit 0

很简单,在启动时运行 start 函数,在关闭时运行 stop函数。
然后运行chkconfig myservice reset,再次重新启动后,奇迹发生了。我们

在/tmp/myservice.log中发现了两句话,关闭时的那句话也打印出来了。到此,我们自定义

的服务算是五脏俱全了。

下面我们举一有一点实际意义的例子,在系统开机时自动运行oracle 数据库,在系统关闭前

,自动关闭oracle数据库,步骤如下:
cd /etc/rc.d/init.d
touch oracle
chmod u+x oracle
oracle文件内容如下:
#!/bin/bash
#chkconfig:345 66 66
#description:oracle service

 

start()
{
 su - oracle -c 'lsnrctl start'
 su - oracle -c 'sqlplus -s / as sysdba <<EOF
  startup;
  exit;
  EOF'
 touch /var/lock/subsys/oracle
}
stop()
{
 su - oracle -c 'sqlplus -s / as sysdba <<EOF
  shutdown immediate;
  exit;
  EOF'
 su - oracle -c 'lsnrctl stop'
 rm -f /var/lock/subsys/oracle

}
case "$1" in
start)
 start
 ;;
stop)
 stop
 ;;
*)
 exit 1
esac
exit 0

运行chkconfig --add oracle添加oracle服务,这样在开机时oracle 数据库和监听就都会自

动启动了,而且在系统关闭前自动关闭

Logo

更多推荐