一、所谓标准系统服务,应该是满足以下几条标准的后台运行程序。 1) 用chkconfig --add来安装,用chkconfig --list检查状态。 2) 用ntsysv来定制某个服务,是否伴随机器的启动而自动启动。
3) 在图形模式下,可以用serviceconf来启动、停止、重启服务。 4) 开机象系统服务那样显示starting,关机显示shutting down。 二、下面是具体的dbora脚本,在Redhat 7.3上通过,本人已经验证了几十次,保证能运行。 备注:启动lsnrctl的时候不用su- 而使用su,否则失败,并且要求使用Oracle用户本身的BASH_ENV.脚本开头的几个ORA_xxx参数都要依照实际情况写,否则会说找不到Oracle程序或者pid.DOS格式方便发文,拷下来后请大家用UltraEdit转为Unix格式。 ------------------------------------------------------------------------ 代码: #!/bin/bash # # /etc/rc.d/init.d/dbora # # Starts the dbora daemon # # chkconfig: 345 94 6 # description: Runs commands scheduled by the at command at the time # specified when at was run, and runs batch commands when the load # average is low enough. # processname: dbora # # copyright: Written by Wwashington AT smth bbs, free to distribute. # You must keep everything in this file, including the copyright # announcement. Study demo: atd & postgresql in /etc/rc.d/init.d # Source function library. INITD=/etc/rc.d/init.d . $INITD/functions # Source system profile. if [ -r /etc/profile ] ; then . /etc/profile ; fi ORA_SID=udb01 ORA_USER=oracle ORA_BASE=/udb01/app/oracle ORA_HOME=/udb01/app/oracle/prodUCt/8.1.7 BASH_ENV=$ORA_BASE/.bashrc test -x $ORA_HOME/bin/dbstart exit 0 RETVAL=0 GREP_UNIX=`uname awk '{if($1 ~ /(^SunOS^HP-UX)/) print $1}'` if ! [ "$GREP_UNIX" = "" ] then GREP_FLAG=ef else GREP_FLAG=efw fi RUNLEVEL=`runlevel awk '{ print $2 }'` # RUNLEVEL=6 case "$RUNLEVEL" in 3) SH_FLAG=1 ;; 4) SH_FLAG=1 ;; 5) SH_FLAG=1 ;; *) SH_FLAG=0 ;; esac # Below is a debug info to display Show Flag # echo RUNLEVEL=$RUNLEVEL , SH_FLAG=$SH_FLAG # # See how we were called. # prog="dbora" start() { # Check flag, if dbora already started, quit dbora if [ ! -f /var/lock/subsys/dbora ]; then echo -n $"Starting $prog: " # This is the background exec which can work under # both CLI (dbora) and GUI mode (serviceconf). We # must forward stderr to a file or null, otherwise # dbora won't start with a return code in GUI mode echo "" echo "[oralog] ----->" echo "Starting Oracle8i: " echo "-------------------------------------------------------------------------" # Please note that forward stderr(2) to /dev/null or &- means close stderr su - $ORA_USER -c "$ORA_HOME/bin/dbstart > /tmp/ORA-dbuplog" 2>/dev/null if [ $SH_FLAG -eq 1 ]; then cat /tmp/ORA-dbuplog fi echo echo "Starting TNS Listener:" echo "-------------------------------------------------------------------------" su $ORA_USER -c "$ORACLE_HOME/bin/lsnrctl start > /tmp/ORA-lsnrlog" 2>&- if [ $SH_FLAG -eq 1 ]; then cat /tmp/ORA-lsnrlog fi pid=`pidof -s ora_pmon_$ORA_SID` if [ "$pid" == "" ]; then RETVAL=1; else RETVAL=0; fi [ $RETVAL -eq 0 ] && touch /var/lock/subsys/dbora echo fi return $RETVAL } stop() { echo -n $"Stopping $prog: " # In order to use database local cmd to keep safe, # we use dbshut instead of simply kill ora_ proc. # When we reboot (runlevel = 0 or 6), no verbose. # Force remove /var/lock/subsys/dbora to activate if [ $SH_FLAG -eq 1 ]; then echo "" echo "[oralog] ----->" echo "Shutting down TNS Listener:" echo "-------------------------------------------------------------------------" su $ORA_USER -c "$ORACLE_HOME/bin/lsnrctl stop" else su $ORA_USER -c "$ORACLE_HOME/bin/lsnrctl stop > /dev/null" fi if [ $SH_FLAG -eq 1 ]; then echo fi if [ $SH_FLAG -eq 1 ]; then echo "Shutting down Oracle8i: " echo "-------------------------------------------------------------------------" su - $ORA_USER -c "$ORA_HOME/bin/dbshut" else su - $ORA_USER -c "$ORA_HOME/bin/dbshut > /dev/null" fi pid=`ps -$GREP_FLAG grep -e ora_ -e lsnr grep -v grep awk '{ print $2 }'` # Show pids when shutdown failed, to see debug info # echo $pid if [ $pid ]; then failure "" else success "" fi echo "" rm -f /var/lock/subsys/dbora return $RETVAL } restart() { echo "Restarting Oracle8i and Listener: " echo "=========================================================================" stop start } reload() { restart } status_ol() { echo "Checking Oracle8i and Listener: " echo "=========================================================================" su - $ORA_USER -c "$ORA_HOME/bin/dbstat" } case "$1" in start) start ;; stop) stop ;; reloadrestart) restart ;; condrestart) if [ -f /var/lock/subsys/dbora ]; then restart fi ;; status) status_ol ;; *) echo $"Usage: $0 {startstoprestartcondrestartstatus}" exit 1 esac exit $? exit $RETVAL 刚才的文件是 /etc/rc.d/init.d/dbora,现在补充一个,$ORACLE_HOME/bin/dbstat GREP_UNIX=`uname awk '{if($1 ~ /(^SunOS^HP-UX)/) print $1}'` if !
[ "$GREP_UNIX" = "" ] then GREP_FILE=/usr/XPg4/bin/grep GREP_FLAG=ef else GREP_FILE=/bin/grep GREP_FLAG=efw fi echo echo "# ps -$GREP_FLAG $GREP_FILE -e ora_ -e lsnr grep -v grep" echo ps -$GREP_FLAG $GREP_FILE -e ora_ -e lsnr grep -v grep echo
|