shell 多进程机制

来源:互联网 发布:mac pro双系统玩游戏 编辑:程序博客网 时间:2024/06/15 08:30
#!/usr/bin/ksh


curtime=`date "+%Y-%m-%d_%H:%M:%S"`
Workdir=`pwd`
cfgfile="${Workdir}/cfg/baseinf.cfg"
backuplogfile="${Workdir}/log/backup.log"
flagdir="${Workdir}/flag"
###############################


Sublog()
{
    echo "[ `date '+%Y%m%d %H:%M:%S'` ] $*" | tee -a ${backuplogfile}
}
###############################
GetCfg()
{
    if [ $# -ne 3 ];then
        print "Error!!Get config value failed!!($*)"
        return 1
    fi
    tmpCfgFile="$1"
    tmpKey="$2"
    tmpValue=`cat ${tmpCfgFile}|grep "${tmpKey}"|grep -v "\["|head -n 1|awk -F "#" '{ print $1 }'|awk -F "=" '{ print $2 }'|tr -d " \t\n\r"`
    eval $3="${tmpValue}"
    return 0
}


#################################


f_getsql()
{
         sqlplus -s ${dbname} >>$backuplogfile <<!
         spool sql_temp_$tablename.txt;
         select column_name from user_tab_columns where table_name= upper('${tablename}') order by column_id;
         spool off;
         exit
!
         #begin add by yinzhida 20110811
         #输出错误日志,一般为数据库用户配置错误
         if [ "$?" -ne 0 ]; then
                   sed -n '5,$'p $backuplogfile
         fi
         #end add by yinzhida 20110811
         if [ -f sql_temp_$tablename.txt ]; then
                   cat sql_temp_$tablename.txt|grep -v "COLUMN_NAME" |grep -v " *-" |grep -v " rows selected" |awk '{print $1}' > sql_temp1_$tablename.txt
                   sed -e '/^[[:space:]]*$/d' sql_temp1_$tablename.txt > sql_temp2_$tablename.txt
         else
                   Sublog "DataBase : ${dbname}, Error :get the column of $tablename failed!!!!!!!!!!!!!!!!"
                   exit
         fi
         fields=""
         fields2=""
         lv_line_num=`cat sql_temp2_$tablename.txt | wc -l`
         lv_index=0


         while read field
         do
                   lv_index=`expr ${lv_index} + 1`
                   if [ ${lv_index} -eq ${lv_line_num} ]; then
                            fields=${fields}${field}"||""'|'"
                            fields2=${fields2}${field}
                   else
                            fields=${fields}${field}"||""'|'""||"
                            fields2=${fields2}${field}","


                   fi
         done < sql_temp2_$tablename.txt


         sql="select "${fields}" from ${tablename} "${condition}
         rm sql_temp_$tablename.txt sql_temp1_$tablename.txt sql_temp2_$tablename.txt
}


##########################################
wait_process()
{
         sleep 1
         while [ 1 ]
         do
                   process_count=`ls ${flagdir}/*.ps 2>/dev/null |wc -l`
                   if [ $process_count -ge $pronum ];then
                                     sleep 5
                   else
                                     break
                   fi
         done
}


##########################################


wait_allprocess()
{
         sleep 1
         while [ 1 ]
         do
                   process_count=`ls ${flagdir}/*.ps 2>/dev/null |wc -l`
                   if [ $process_count -ge 1 ];then
                                     sleep 5
                   else
                                     break
                   fi
         done
}
##########################################
# main


GetCfg $cfgfile "DBNAME" dbname
GetCfg $cfgfile "DBTYPE" dbtype
GetCfg $cfgfile "TABFILE" tablelist
GetCfg $cfgfile "PRONUM" pronum
dbtype=`echo $dbtype|tr "[:upper:]" "[:lower:]"`
#begin add by yinzhida 20110811


#判断是否已存在备份,


file_count=`ls ${Workdir}/bak/*.unl 2>/dev/null |wc -l`
if [ $file_count -gt 0 ];then
         echo "the backup files existed, backup again(y/n)?"
         read tmpval
         tmpval2=`echo $tmpval|tr "[:upper:]" "[:lower:]"`
         if [ $tmpval2 != "y" ];then
                   exit
         fi
fi
#end add by yinzhida 20110811
echo "" > ${backuplogfile}
rm -f ${flagdir}/*.ps
rm -f ${flagdir}/backup.flag
Sublog "=== begin backup table from ${dbtype} phydb ==="
Sublog "DataBase      : ${dbname}"
Sublog "Process count : ${pronum}"
for tablename in `cat ${Workdir}/cfg/$tablelist`
do
         wait_process
         ( touch ${flagdir}/${tablename}.ps
         Sublog "--- begin backup $tablename..."
    f_getsql
         sqlplus -s ${dbname} > /dev/null  <<!
         set head off
         set serveroutput on
         set feedback off
         set trims on
         set pagesize 0
         set timing off
         set termout off
         set lin 5000
         alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
         spool bak/$tablename.unl
         $sql;
         spool off
         set serveroutput off
!
         if [ "$?" -ne 0 ]; then
                   Sublog "+++ backup table ${tablename} failed!!!!!!!!!!!!!!!!!!"   
         else
                   Sublog "+++ backup table ${tablename} successfully"            
         fi
         rm ${flagdir}/${tablename}.ps ) &
done
wait_allprocess
echo "" > ./flag/backup.flag
Sublog "=== end backup table from oracle phydb ==="


# end


 
0 0