셸 다 중 프로 세 스 간단 한 방식

3872 단어 셸 스 크 립 트
많은 사내 들 이 & 기호 와 for 순환 을 이용 하여 백 스테이지 에 놓 고 집행 하 는데 이 로 움 과 해로 움 이 있 습 니 다. 코드 는 다음 과 같 습 니 다.
#!/bin/bash
for i in `seq 100`;do
sleep 1 &
done

이렇게 백 번 의 순환 을 실 행 했 지만 매번 sleep 는 백 엔 드 에 놓 여 있 습 니 다. 1 초도 안 되 어 끝 났 고 완전히 제어 할 수 없습니다. 제 가 물건 을 다운로드 하고 싶 을 때 대량의 연결 을 만들어 백 엔 드 에 두 는 것 은 cpu 메모리 에 적지 않 은 압력 을 가 하 는 동시에 대역 폭 을 대폭 차지 합 니 다.
그리고 사내 들 은 이해 하기 어 려 운 통제 가능 한 방식 을 써 서 매번 백 스테이지 에 일정 수량의 프로 세 스 를 동시에 놓 지만 이해 하기 어렵다.
어느 날, 데이터 백업 스 크 립 트 를 하나 더 쓸 때 새로운 생각 이 들 었 습 니 다. HBASE 에 대량의 시계 가 있 기 때문에 단일 백업 이 너무 느 리 고 배경 Hadoop 자원 이 부족 합 니 다. 또한 그 시계 백업 이 성공 하거나 실 패 했 는 지 알 아야 합 니 다. 백 스테이지 에 만 놓 을 수 있 는 명령 이 너무 부족 합 니 다. 모든 프로 세 스 가 중단 되 었 습 니 다. 생각 한 후에 백업 문구 와 판단 을 함수 에 적 습 니 다.for 순환 을 이용 하여 함 수 를 배경 에 놓 습 니 다. 또한 변 수 를 설정 하여 판단 방식 으로 배경 에 놓 인 프로 세 스 수 를 검사 합 니 다. 충분 하 다 면 wait 를 실행 하고 프로 세 스 가 실 행 될 때 까지 기다 리 십시오. 스 크 립 트 는 다음 과 같 습 니 다.
#!/bin/bash
#       
# 70  24  
#     bc     HBASE Hadoop       
LogDir='/var/log/data-backup'
mkdir $LogDir
LogFile='data-migration'
start(){
   source /etc/profile >/dev/null
   BackupTime=`date +%F`
   Backup_hbase_command='org.apache.hadoop.hbase.mapreduce.Export'
   HDFS_path='/backup'
   local_path='/backup'
   #             
   remove_day='3'
   # concurrent_number              
   #                ,              Hadoop  ,        MapReduce  ,                   
   concurrent_number='1'
   if [ ! -f ${LogDir} ];then
       mkdir -p ${LogDir}
   fi
}
# HBASE   
#            
backup_command(){
   echo "[ `date +%F-%T` ] $i start backup,this is a tables $a"
   #    $i  for         i
   hbase ${Backup_hbase_command} $i ${HDFS_path}/${BackupTime}/$i >>$LogDir/${LogFile}-$a.log 2>&1
   #            
   if [ $? -eq 0 ];then
       echo "[ `date +%F-%T` ] $i backup sucess"
   else
       echo "[ `date +%F-%T` ] $i backup error"
   fi
}

HbaseBackup(){
   echo "[ `date +%F-%T` ] Hbase backup start"
   echo "list" |hbase shell >/dev/null
   if [ $? -eq 0 ];then
       echo "HBASE status is a: started"
   else
       echo "HBASE statua is a: stoped!"
       exit
   fi
   a='1'
   for i in `echo "list"|hbase shell |sed '1,6d'|sed '$d'|sed '$d'|sed '$d'`;do
   #       for  ,         ,        ,         
       backup_command &
       #           0,              ,       wait ,wait              ,         
       if [[ `echo "$a % ${concurrent_number}"|bc` == 0  ]];then
           wait
           a=`echo "$a + 1"|bc`
       else
           a=`echo "$a + 1"|bc`
       fi
   done
}
data_export_local(){
   echo "[ `date +%F-%T` ] hdfs to local started"
   hdfs dfs -copyToLocal ${HDFS_path}/${BackupTime} ${local_path}
   echo "[ `date +%F-%T` ] hdfs to local stoped"
}
hive_backup(){
   echo "[ `date +%F-%T` ] hive backup start"
   backup_path='/backup/hive'
   backup_time=`date +%F`
   if [ ! -f ${backup_path} ];then
       mkdir -p $backup_path
   fi
   hdfs dfs -copyToLocal /user/hive ${backup_path}
   #                y      
   mv ${backup_path}/hive ${backup_path}/hive-${backup_time}
   hive_remove_time=`date -d "${remove_day} day ago" +%F`
   rm -rf ${backup_path}/hive-${hive_remove_time}
   echo "[ `date +%F-%T` ] hive backup end"
}
remove_time_backup(){
   remove_time=`date -d "${remove_day} day ago" +%F`
   hdfs dfs -rmr ${HDFS_path}/${remove_time}
   rm -rf ${local_path}/${remove_time}
}
start >>$LogDir/${LogFile} 2>&1
HbaseBackup >>$LogDir/${LogFile} 2>&1
data_export_local >>$LogDir/${LogFile} 2>&1
remove_time_backup >>$LogDir/${LogFile} 2>&1
hive_backup >>$LogDir/${LogFile} 2>&1

좋은 웹페이지 즐겨찾기