shell编程范例

common-config.sh

function initConfig(){
  ##配置库的数据库ip地址
  configIpAddr=1
  ##端口
  configPort=3306
  ##用户名
  configUserName=
  ##密码
  configPassword=
  ##数据库
  configDatabaseName=
  ##
  configSyncStatus=0
  ##
  configStatus=1
  ##
  mysqlDateFormat="%Y-%m-%d %H:%i:%S"
  ##
  linuxDateFormat="%Y-%m-%d %H:%M:%S"
  ##
  linuxThreadCount=10
}
pos-config.sh
#!/bin/bash

source ./common-config.sh

##初始化变量
function initVar(){
  initConfig
  ##mysql的ip地址
  ipAddr=
  ##端口
  port=3306
  ##用户名
  userName=retail_pos
  ##密码
  password=retail_pos
  ##数据库
  databaseName=retail_pos
  ##业务数据的分页大小
  dataPageSize=1000
  ##任务的分页大小
  configPageSize=10
  ##组名
  groupName=7006
  ##触发器名
  triggerName=pos
  ##查询sql语句
  configSelectSql="select id,schema_name,table_name,sync_col_name,sync_begin_time,sync_freq,(case when (unix_timestamp(now())-unix_timestamp(sync_begin_time)>sync_freq+(sync_freq/2)) then now() else date_add(sync_begin_time,interval sync_freq second) end) as sync_end_time from task_status where group_name = '$groupName' and trigger_name = '$triggerName' and config_status = $configStatus and sync_status in ($configSyncStatus)"
}
pos_main.sh
##使用bash解析器
#!/bin/bash

##引用资源
source ./pos-config.sh

##主方法
function main(){
  initVar
  loadTask
}


##加载配置文件的任务
function loadTask(){
  local taskCount=0
  mysql -h$configIpAddr -P$configPort -D$configDatabaseName -u$configUserName -p$configPassword -s -N -e "$configSelectSql" |
  while read id schema_name table_name sync_col_name sync_begin_time sync_end_time; do 
    sh /usr/local/wonhigh/test/pos_task.sh $schema_name $table_name $sync_col_name $sync_begin_time $sync_end_time
    if [ $linuxThreadCount -gt $taskCount ]; then
      taskCount=`expr $taskCount + 1`
    else
      local threadNum=`ps -ef | grep "pos_task.sh" | grep -v grep | wc -l`
      for((;$linuxThreadCount <= $threadNum;)) do
        local threadNum=`ps -ef | grep "pos_task.sh" | grep -v grep | wc -l`
        if [ $linuxThreadCount -gt $threadNum ]; then
          taskCount=`expr $taskCount - 1`
          break
        fi
      done;
    fi
  done;
}

main
<pre name="code" class="plain">pos_task.sh
 
<pre name="code" class="plain">source /usr/local/wonhigh/test/pos-config.sh


initVar


function loadData(){
  local sync_begin_time=`date -d "$4" +"%Y-%m-%d %H:%M:%S"`
  local sync_end_time=`date -d "$5" +"%Y-%m-%d %H:%M:%S"`
  local dataCountSql="select count(*) from $1.$2 t where $3 >= str_to_date('$sync_begin_time','%Y-%m-%d %H:%i:%S') and $3 < str_to_date('$sync_end_time','%Y-%m-%d %H:%i:%S')"
  local dataTotalCount=`mysql -h$ipAddr -P$port -D$databaseName -u$userName -p$password -N -e "$dataCountSql"`
  local dataSqlStr="select t.* from $1.$2 t where $3 >= str_to_date('$sync_begin_time','%Y-%m-%d %H:%i:%S') and $3 < str_to_date('$sync_end_time','%Y-%m-%d %H:%i:%S') "
  local forCount=`expr $dataTotalCount / $dataPageSize`
  for((i=0; i<=$forCount; i++)); do
    dataSqlStr1="$dataSqlStr limit $i,$dataPageSize"
echo $dataSqlStr1
    mysql -h$ipAddr -P$port -D$databaseName -u$userName -p$password -s -N -e "$dataSqlStr1" > /usr/local/wonhigh/test/$1.$2.log
  done
}


loadData "$@"

 



Shell脚本高级编程教程,希望对你有所帮助。 Example 10-23. Using continue N in an actual task: 1 # Albert Reiner gives an example of how to use "continue N": 2 # --------------------------------------------------------- 3 4 # Suppose I have a large number of jobs that need to be run, with 5 #+ any data that is to be treated in files of a given name pattern in a 6 #+ directory. There are several machines that access this directory, and 7 #+ I want to distribute the work over these different boxen. Then I 8 #+ usually nohup something like the following on every box: 9 10 while true 11 do 12 for n in .iso.* 13 do 14 [ "$n" = ".iso.opts" ] && continue 15 beta=${n#.iso.} 16 [ -r .Iso.$beta ] && continue 17 [ -r .lock.$beta ] && sleep 10 && continue 18 lockfile -r0 .lock.$beta || continue 19 echo -n "$beta: " `date` 20 run-isotherm $beta 21 date 22 ls -alF .Iso.$beta 23 [ -r .Iso.$beta ] && rm -f .lock.$beta 24 continue 2 25 done 26 break 27 done 28 29 # The details, in particular the sleep N, are particular to my 30 #+ application, but the general pattern is: 31 32 while true 33 do 34 for job in {pattern} 35 do 36 {job already done or running} && continue 37 {mark job as running, do job, mark job as done} 38 continue 2 39 done 40 break # Or something like `sleep 600' to avoid termination. 41 done 42 43 # This way the script will stop only when there are no more jobs to do 44 #+ (including jobs that were added during runtime). Through the use 45 #+ of appropriate lockfiles it can be run on several machines 46 #+ concurrently without duplication of calculations [which run a couple 47 #+ of hours in my case, so I really want to avoid this]. Also, as search 48 #+ always starts again from the beginning, one can encode priorities in 49 #+ the file names. Of course, one could also do this without `continue 2', 50 #+ but then one would have to actually check whether or not some job 51 #+ was done (so that we should immediately look for the next job) or not 52 #+ (in which case we terminate or sleep for a long time before checking 53 #+ for a new job).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值