
很多时候我们需要将程序服务在操作系统启动后能够自动启动,当有了这样的配置,一方面可以简化维护,另外一方面一旦系统出现问题重启后也会启动这些服务,不影响业务。
今天我们就从这部分功能配置出发,通过oracle自启动服务来学习相关知识
1、脚本文件
我们需要提供一个服务启动配置脚本,这个shell脚本格式后面我们会拿oracle的启动服务脚本oracledb_ORCLCDB-19c讲,脚本文件需要放到/etc/init.d下面
2、使用命令
service命令
linux 6之前的版本都使用这个命令管理服务
servcie iptables start --启动防火墙
servcie iptables stop --关闭防火墙
servcie iptables status --查看防火墙
servcie iptables restart --重启防火墙
chkconfig命令
linux 6之前的版本都使用这个命令管理服务
chkconfig -add httpd --增加httpd服务
chkconfig -del httpd --删除httpd服务
chkconfig -list mysqld --列出mysqld服务设置情况
chkconfig mysqld on --永久设定开机运行服务
chkconfig mysqld off --永久设定开机不运行服务
systemctl命令
linux 7之后的版本都使用这个命令管理服务
systemctl stop firewalld.service --关闭防火墙命令
systemctl start firewalld.service --开启防火墙
systemctl restart firewalld.service --重启防火墙
systemctl status firewalld.service --查看防火墙
systemctl disable firewalld.service --关闭开机自启动
systemctl enable firewalld.service --开启开机启动
#!/bin/bash
#
# chkconfig: 2345 80 05
# Description: This script is responsible for taking care of configuring the Oracle Datab
ase and its associated services.
case $PATH in
"") PATH=/bin:/usr/bin:/sbin:/etc
export PATH ;;
esac
if [ $(id -u) != "0" ]
then
echo "You must be root user to run the configurations script. Login as root user
and try again."
exit 1
fi
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export ORACLE_VERSION=19c
export ORACLE_SID=ORCLCDB
export TEMPLATE_NAME=General_Purpose.dbc
export CHARSET=AL32UTF8
export PDB_NAME=ORCLPDB1
export LISTENER_NAME=LISTENER
export NUMBER_OF_PDBS=1
export CREATE_AS_CDB=true
export PATH=$ORACLE_HOME/bin:$PATH
LSNR=$ORACLE_HOME/bin/lsnrctl
SQLPLUS=$ORACLE_HOME/bin/sqlplus
DBCA=$ORACLE_HOME/bin/dbca
NETCA=$ORACLE_HOME/bin/netca
ORACLE_OWNER=oracle
RETVAL=0
CONFIG_NAME="oracledb_$ORACLE_SID-$ORACLE_VERSION.conf"
CONFIGURATION="/etc/sysconfig/$CONFIG_NAME"
if [ -z "$SU" ];then SU=/bin/su; fi
if [ -z "$GREP" ]; then GREP=/usr/bin/grep; fi
if [ ! -f "$GREP" ]; then GREP=/bin/grep; fi
start()
{
check_for_configuration
RETVAL=$?
if [ $RETVAL -eq 1 ]
then
echo "The Oracle Database is not configured. You must run '/etc/init.d/oracledb_$
ORACLE_SID-$ORACLE_VERSION configure' as the root user to configure the database."
exit
fi
pmon=`ps -ef | egrep pmon_$ORACLE_SID'\>' | $GREP -v grep`
if [ "$pmon" = "" ];
then
unset_proxy_vars
echo "Starting Oracle Net Listener."
$SU -s bin/bash $ORACLE_OWNER -c "$LSNR start $LISTENER_NAME" > dev/null 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ]
then
echo "Oracle Net Listener started."
fi
echo "Starting Oracle Database instance $ORACLE_SID."
$SU -s bin/bash $ORACLE_OWNER -c "$SQLPLUS -s nolog << EOF
connect as sysdba
startup
alter pluggable database
all open
exit;
EOF" > dev/null 2>&1
RETVAL1=$?
if [ $RETVAL1 -eq 0 ]
then
echo "Oracle Database instance $ORACLE_SID started."
fi
else
echo "The Oracle Database instance $ORACLE_SID is already started."
exit 0
fi
echo
if [ $RETVAL -eq 0 ] && [ $RETVAL1 -eq 0 ]
then
return 0
else
echo "Failed to start Oracle Net Listener using $ORACLE_HOME/bin/tnslsnr and Orac
le Database using $ORACLE_HOME/bin/sqlplus."
exit 1
fi
}
stop()
{
check_for_configuration
RETVAL=$?
if [ $RETVAL -eq 1 ]
then
echo "The Oracle Database is not configured. You must run '/etc/init.d/oracledb_$
ORACLE_SID-$ORACLE_VERSION configure' as the root user to configure the database."
exit 1
fi
pmon=`ps -ef | egrep pmon_$ORACLE_SID'\>' | $GREP -v grep`
if [ "$pmon" = "" ]
then
echo "Oracle Database instance $ORACLE_SID is already stopped."
exit 1
else
unset_proxy_vars
echo "Shutting down Oracle Database instance $ORACLE_SID."
$SU -s bin/bash $ORACLE_OWNER -c "$SQLPLUS -s nolog << EOF
connect as sysdba
shutdown immediate
exit;
EOF" > dev/null 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ]
then
echo "Oracle Database instance $ORACLE_SID shut down."
fi
echo "Stopping Oracle Net Listener."
$SU -s bin/bash $ORACLE_OWNER -c "$LSNR stop $LISTENER_NAME" > dev/null 2>&1
RETVAL1=$?
if [ $RETVAL1 -eq 0 ]
then
echo "Oracle Net Listener stopped."
fi
fi
echo
if [ $RETVAL -eq 0 ] && [ $RETVAL1 -eq 0 ]
then
return 0
else
echo "Failed to stop Oracle Net Listener using $ORACLE_HOME/bin/tnslsnr and Oracl
e Database using $ORACLE_HOME/bin/sqlplus."
exit 1
fi
}
configure_perform()
{
unset_proxy_vars
echo "Configuring Oracle Database $ORACLE_SID."
$SU -s bin/bash $ORACLE_OWNER -c "$DBCA -silent -createDatabase -gdbName $ORACLE_SI
D -templateName $TEMPLATE_NAME -characterSet $CHARSET -createAsContainerDatabase $CREATE_
AS_CDB -numberOfPDBs $NUMBER_OF_PDBS -pdbName $PDB_NAME -createListener $LISTENER_NAME:$L
ISTENER_PORT -datafileDestination $ORACLE_DATA_LOCATION -sid $ORACLE_SID -autoGeneratePas
swords -emConfiguration DBEXPRESS -emExpressPort $EM_EXPRESS_PORT"
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]
then
echo "Database configuration completed successfully. The passwords were auto gene
rated, you must change them by connecting to the database using 'sqlplus as sysdba' as
the oracle user."
return 0
else
echo "Database configuration failed."
exit 1
fi
}
unset_proxy_vars()
{
if [ "$http_proxy" != "" ]
then
unset http_proxy
fi
if [ "$HTTP_PROXY" != "" ]
then
unset HTTP_PROXY
fi
if [ "$https_proxy" != "" ]
then
unset https_proxy
fi
if [ "$HTTPS_PROXY" != "" ]
then
unset HTTPS_PROXY
fi
}
check_for_configuration()
{
configfile=`$GREP --no-messages $ORACLE_SID:$ORACLE_HOME etc/oratab` > dev/null 2>&
1
if [ "$configfile" = "" ]
then
return 1
fi
return 0
}
read_config_file()
{
if [ -f "$CONFIGURATION" ]
then
. "$CONFIGURATION"
else
echo "The Oracle Database is not configured. Unable to read the configuration fil
e '$CONFIGURATION'"
exit 1;
fi
}
configure()
{
check_for_configuration
RETVAL=$?
if [ $RETVAL -eq 0 ]
then
echo "Oracle Database instance $ORACLE_SID is already configured."
exit 1
fi
read_config_file
check_port_availability
check_em_express_port_availability
configure_perform
}
check_port_availability()
{
port=`netstat -n --tcp --listen | $GREP :$LISTENER_PORT`
if [ "$port" != "" ]
then
echo "Port $LISTENER_PORT appears to be in use by another application. Specify a
different port in the configuration file '$CONFIGURATION'"
exit 1;
fi
}
check_em_express_port_availability()
{
port=`netstat -n --tcp --listen | $GREP :$EM_EXPRESS_PORT`
if [ "$port" != "" ]
then
echo "Port $EM_EXPRESS_PORT appears to be in use by another application. Specify
a different Oracle EM Express port in the configuration file '$CONFIGURATION'"
exit 1;
fi
}
restart()
{
pmon=`ps -ef | egrep pmon_$ORACLE_SID'\>' | $GREP -v grep`
if [ "$pmon" = "" ]
then
start
else
stop
start
fi
}
configure_delete()
{
unset_proxy_vars
ORABASE=`$ORACLE_HOME/bin/orabase`
NETCA_LOG_DIR="$ORABASE/cfgtoollogs/netca"
LSNR_CONFIG_FILE="$ORACLE_HOME/network/admin/listener.ora"
if [ ! -d "$NETCA_LOG_DIR" ]
then
$SU -s bin/bash $ORACLE_OWNER -c "$MKDIR_CMD -p $NETCA_LOG_DIR"
fi
NETCA_LOG="$NETCA_LOG_DIR/netca_deinst_out.log"
echo "Detecting existing Listeners..."
if [ -f "$LSNR_CONFIG_FILE" ]
then
NUMBER_OF_LISTENERS=`grep -w "DESCRIPTION_LIST" $LSNR_CONFIG_FILE | wc -l`
if [ "$NUMBER_OF_LISTENERS" == "1" ]
then
echo "Deleting Oracle Listener...."
$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR stop $LISTENER_NAME" > /dev/null 2>&1
$SU -s /bin/bash $ORACLE_OWNER -c "$NETCA /deinst >>$NETCA_LOG"
else
if [ "$NUMBER_OF_LISTENERS" != "0" ]
then
echo "There were more Listeners detected. Verify and remove them manually so th
e service can be safely deleted"
exit
else
echo "No Listeners were detected. Proceeding with Database removal"
fi
fi
else
echo "No Listener configuration file found. Proceeding with Database removal"
fi
echo "Detecting existing Oracle Databases..."
check_for_configuration
RETVAL=$?
if [ $RETVAL -eq 0 ]
then
echo "Deleting Oracle Database $ORACLE_SID."
$SU -s /bin/bash $ORACLE_OWNER -c "$DBCA -silent -deleteDatabase -sourceDB $ORACLE
_SID -skipSYSDBAPasswordPrompt true"
else
echo "The Oracle Database is not configured. You must run '/etc/init.d/oracledb_$OR
ACLE_SID-@<DBNRMAJVSNLETTER_STR>@ configure' as the root user to configure the database"
exit
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
configure)
configure
;;
delete)
configure_delete
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|restart|configure|delete}"
exit 1
;;
esac
exit 0
1、重点代码说明
#!/bin/bash
# chkconfig: 2345 80 05
# Description: This script is responsible for taking care of configuring the Oracle Database and its associated services.
这三行代码非常重要,第一行是sh脚本必须的,说明使用什么sh来运行这个脚本,第二行是配置了三个参数,2345是运行级别,80是开机顺序,05是关机顺序。对于没有前置任务和系统运行级别要求的程序,可以参考这个设置即可。
2、使用函数确保程序可读性
case "$1" in
start)
start
;;
stop)
stop
;;
configure)
configure
;;
delete)
configure_delete
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|restart|configure|delete}"
exit 1
;;
esac
通过程序第一个参数来调用不同函数,这就是我们运维命令参数来实现启停的逻辑。
3、有大量的环境变量检测,确保脚本可执行
# Setting the required environment variables
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export ORACLE_VERSION=19c
export ORACLE_SID=ORCLCDB
export TEMPLATE_NAME=General_Purpose.dbc
export CHARSET=AL32UTF8
export PDB_NAME=ORCLPDB1
export LISTENER_NAME=LISTENER
export NUMBER_OF_PDBS=1
export CREATE_AS_CDB=true
case $PATH in
"") PATH=/bin:/usr/bin:/sbin:/etc
export PATH ;;
esac
# Check if the root user is running this script
if [ $(id -u) != "0" ]
then
echo "You must be root user to run the configurations script. Login as root user and try again."
exit 1
fi
确保脚本执行的环境变量检测,一旦没有,就需要自己设置,比如程序需要root运行执行,就需要检查当前用户是否为root,另外后面需要调用很多系统命令比如ps,grep,因此检测PATH环境变量,如果没有就需要设置。
通过这部分的分析,我们看到的脚本自身健壮性对维护的重要性。
4、脚本运行返回值
exit 0;
如果程序能正常运行结束,需要返回0,这样方便别的shell检测是否正常运行
exit 1;
如果在执行过程中出现任何的错误,就需要返回1。




