91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

shell的多進程實現

發布時間:2020-08-06 20:11:29 來源:ITPUB博客 閱讀:132 作者:haolinhappy 欄目:建站服務器



方法總結:

    1. command & + wait 方式
    2. 管道fifo

                   
    1.1
    實例1.1:將需要多進程執行的程序塊全部使用command & wait 轉移到后臺執行即可。
          用“{}”將主執行程序變為一個塊,用&放入后臺,四次執行全部放入后臺后,
          需要用一個wait指令,等待所有后臺進程執行結束,
          不然系統是不會等待的,直接繼續執行后續指令,直到整個程序結束。
    
     #!/bin/bash
     start=`date +"%s"`
     for (( i=0; i<10; i++ ))
     do
         {
             echo "success!!!"
             sleep 3
         } &  #將上述程序塊放到后臺執行
     done
     wait    #等待上述程序結束
     end=`date +"%s"`
     echo "time: " `expr $end - $start`
     
    
    2.1
    實例2.1:
    #!/bin/sh
    function a_sub {
        sleep 2;
        endtime=`date +%s`
        sumtime=$[$endtime-$starttime]
        echo "我是whl,整個腳本已經執行了$sumtime秒"
    }
    
    starttime=`date +%s`
    export starttime
    
    tmp_fifofile="/tmp/$$.fifo"               ##其中$$為該進程的pid
    
    mkfifo $tmp_fifofile                      ##創建命名管道
    
    exec 6<>$tmp_fifofile                     ##把文件描述符6和FIFO進行綁定
        
    rm -f $tmp_fifofile                       ##綁定后,該文件就可以刪除了
        
    thread=30                                 ## 進程并發數為30,用這個數字來控制一次提交的請求數
    
    for ((i=0;i<$thread;i++));
    do    
        echo >&6                              ##寫一個空行到管道里,因為管道文件的讀取以行為單位
    done
    
    
    while read dat
    do
          ##讀取管道中的一行,每次讀取后,管道都會少一行
        read -u6
        {        a_sub || {echo "a_sub is failed"}
                   echo $dat
                   echo >&6                     ##每次執行完a_sub函數后,再增加一個空行,這樣下面的進程才可以繼續執行
        } &
    done<data.txt
    
    wait                                     ##這里的wait意思是,需要等待以上所有操作(包括后臺的進程)都結束后,再往下執行。
       
    exec 6>&-                                ##關閉文件描述符6的寫
    exec 6<&-
         
         
         
     
     實例2:多線程備份數據庫
     
     #!/bin/bash
     hour=`date +%H`
     day=`date +%F`
     now=`date +%F_%H`
     all_dbs="no"
     passwd="mysql_pass"
     sshpass="ssh_pass"
     dbs="db1 db2 db3 dbx dby dbz"
     
     cpu_num=`cat /proc/cpuinfo |grep processor|wc -l`
     p_fifo="/tmp/$$.pipo"
     mkfifo $p_fifo
     exec 111<>$p_fifo       #關聯文件描述符和管道
     rm -f $p_fifo
     trap "exec 111>&-;exec 111<&-;exit 0" 2    
     for ((i=1; i<=$cpu_num; i++))
     do
         echo >&111             #定義進程隊列大小,cpu核數
     done
     
     function backup()
     {
         if [ $all_dbs == "no" ];then
             for db in $dbs
             do
                 read -u111      #從隊列中獲取一個消息,隊列中消息數減一
                 {
                 dbname=`echo $db|sed "s/-/@002d/g"`
                 ops="--parallel=5 --compress-threads=5 --databases=$dbname"
                 bpath="/data1/ehr-mysql-backup/${day}/${db}"
                 inbackup
                 sleep 10
                 echo >&111  #添加一個消息到隊列中,維持隊列中消息數不變(進程個數)
                 } &               #將代碼塊放后臺處理
             done
             wait                 #等待所有后臺進程處理完
             exec 111>&-          #關閉描述符,寫關閉
             exec 111<&-          #關閉描述符,讀關閉
         else
             ops="--parallel=5 --compress-threads=5"
             bpath="/data1/ehr-mysql-backup/${day}"
             inbackup
         fi
     }
     
     function inbackup()
     {
         if [ -f ${bpath}/lsn_${last}/xtrabackup_checkpoints ];then
             echo "incremental_basedir found,do a increment backup"
             /usr/bin/innobackupex -u root -p${passwd} --no-timestamp ${ops} --incremental --incremental_basedir=${bpath}/lsn_${last}/ --extra-lsndir=${bpath}/lsn_${now}/ ${bpath} --stream=xbstream |gzip |sshpass -p "${sshpass}" ssh -p 18122 root@10.10.10.79 "cat - > ${bpath}/${now}.xbstram.gz"
         else
             echo "incremental_basedir not found,do a full backup"
             /usr/bin/innobackupex -u root -p${passwd} --no-timestamp ${ops} --extra-lsndir=${bpath}/lsn_${now}/ ${bpath} --stream=tar |gzip |sshpass -p "${sshpass}" ssh -p 18122 root@10.10.10.79 "cat - > ${bpath}/${now}.tgz"
         fi
     
     }
     
     case $hour in
     22)
             last=`date +%F -d -yesterday`
             find /data1/ehr-mysql-backup/ -name "${last}*" -type d -exec rm -r "{}" \;
             day=`date +%F -d +1days`
             backup
             ;;
     10)
             last=`date +%F_%H -d -12hours`
             backup
             ;;
     14|18)
             last=`date +%F_%H -d -4hours`
             backup
             ;;
     *)
             echo "not backup time"
             ;;
     esac
          
         

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汝阳县| 吉水县| 三门峡市| 永丰县| 永泰县| 陆河县| 乡城县| 南川市| 梅州市| 江阴市| 泽库县| 凤台县| 沈阳市| 新乡市| 镇康县| 微博| 宁安市| 射洪县| 特克斯县| 霍林郭勒市| 昌宁县| 岑溪市| 什邡市| 东方市| 富源县| 确山县| 阳信县| 泰州市| 兰州市| 云浮市| 缙云县| 普兰店市| 彭阳县| 柳州市| 广西| 阳西县| 阿瓦提县| 永春县| 天峻县| 孟津县| 玉树县|