概述
网上有不少关于如何让Linux自动运行自己编写的脚本或者程序的方法,但是大多数都是把命令写到/etc/rc.d/rc.local或者/etc/rc.local里,这样虽然能够实现随机运行,但是并不够灵活。不能像mysql,apache等服务一样能够使用service命令或者调用init.d下的脚本启动、关闭或者重启进程。例如,
service mysql restart
service apache2 stop
或者
/etc/init.d/mysql restart
/etc/init.d/apache2 stop
同时也无法整合入heartbeat这样的高可用程序中进行监控。因此,创建自定义的linux服务还是有其必要性的。
因为不同的Linux发行版本,对后台服务的处理方式不大一样,所以下面以RHEL系统为例,编写一个Oracle随机启动服务。
创建服务
服务脚本
cat /etc/init.d/czm
#!/bin/bash
# chkconfig: 2345 20 81
#description: czmmmmm??????????????????????
export ORACLE_SID=orcl
export ORACLE_PID=`ps -ef|grep ora|grep -E 'smon|pmon|ckpt'|wc -l`
export ORACLE_BASE=/u01/app
export ORACLE_HOME=/u01/app/oracle
export PATH=$PATH:$ORACLE_HOME/bin
ORA_OWNR="oracle"
if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
?? then
?? echo "Oracle startup:can't start"
?? exit 1
fi
case "$1" in
? start)
? echo -n "Starting Oracle:"
? su - $ORA_OWNR -c "$ORACLE_HOME/bin/dbstart"
? echo "OK"
? ;;
? stop)
? echo -n "Shutdown Oracle:"
? su - $ORA_OWNR -c "$ORACLE_HOME/bin/dbshut"
? echo "OK"
? ;;
? status)
? if [ $ORACLE_PID = "3" ];then
???? echo "Oracle Instance is running..."
? else echo "Oracle Instance is not running..."
? fi
? ;;
? restart)
? $0 stop
? $0 start
? ;;
? *)
? echo "Usage:`basename $0` start|stop|status|restart"
esac
exit $?
脚本说明
#!/bin/bash,声明脚本采用bash作为shell。#chkconfig后面三个参数分别表示服务在哪几个运行级别启动(本例是在2,3,4,5),在启动和关闭时服务脚本执行的优先级。#description是对该服务的描述。加上这两行之后才能用chkconfig命令添加服务。另外,服务脚本最好放在/etc/init.d/目录下
一个linux服务脚本必须包含start,stop和restart,而status不是必须的。关于status有两种方式实现以查看程序的运行状态,一种为上文提到的根据程序的特点自行编写判断脚本,另一种则是利用linux自带的/etc/init.d/functions这个脚本中包含了下面包含的status函数,来打印当前服务进程的状态,当然前提是运行的程序能够产生pid文件 ,代码如下
#!/bin/bash
# autoruntest the shell script takes care of autoruntest auto start and stop
# chkconfig:?? 2345 20 80
# description: autoruntest
# processname:???? /etc/rc.d/init.d/autoruntest
EXEC_PATH=/home/paradis/app
EXEC=autoruntest
PID_FILE=/var/run/autoruntest.pid
DAEMON=/home/paradis/code/autoruntest
# Source function library.
.? /etc/rc.d/init.d/functions
<