> 数据库 > Oracle >

Oracle 的标准系统服务脚本 for Redhat Linux

发信人: Wwashington (Jacky), 信区: NewSoftware 
标 题: Oracle 的标准系统服务脚本 for Redhat Linux 
发信站: BBS 水木清华站 (Sat Oct 16 22:08:19 2004), 站内 

作者:Wwashington AT smth bbs 
时间:2004/10/16 

前言:欢迎转载,但是您必须保留原文所有信息,包括作者和时间。 

一、这个跟国庆前我发表的 dbids 类似,是把数据库作为标准服务 
安装到 Linux 的系统脚本。这个也是原创的,与青蛙网友分享。 

二、所谓标准系统服务,应该是满足以下几条标准的后台运行程序。 
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 wont 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 
    ;; 
reload|restart) 
    restart 
    ;; 
condrestart) 
    if [ -f /var/lock/subsys/dbora ]; then 
        restart 
    fi 
    ;; 
status) 
    status_ol 
    ;; 
*) 
    echo $"Usage: $0 {start|stop|restart|condrestart|status}" 
    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 "#

(责任编辑:IT)