• bash实现多进程运行


    之前一段时间,发现线上日志服务器总是会突然丢失日志,碰到问题时搞的很被动。联系运维同学,又总是被往后推(后来看了一下日志归档脚本,运维同学写的bug)。索性自己写了一个脚本,添加到crontab任务中,替换运维同学的脚本。

    线上服务器每天大概产生6000-10000个日志文件(部分级别的日志),每个文件99m。压缩时考虑到尽可能多保留日志,gzip设置的9,压缩比最大、但是最慢的压缩算法。如果以单个进程来慢慢压缩、按天归档,日志较多时,一天都归不完。所以肯定要多个进程压缩。

    bash中,把任务放到后台运行就可以实现『多进程』。不过,线上服务器不能影响到其它服务运行,必须限制进程个数,所以用了一个令牌池来限制进程数。

    #!/bin/bash
    date=`date -d '2 days ago' +%Y-%m-%d`
    declare -a files
    files=`find /data1/error/error-${date}_* -type f`
    Npro=10 #并行10个子进程压缩
    Pfifo="/tmp/$$.fifo"
    mkfifo $Pfifo # 新建一个fifo类型的文件
    exec 6<>$Pfifo # 将fd 6指向该文件
    rm -f $Pfifo
    for((i=1; i<=$Npro; i++)); do
            echo
    done >&6 # 在fd 6指向的文件中放置$Npro个回车符,作为令牌
    
    for file in $files
    do
            read -u6 #从fd 6中读出减去一个回车符,然后向下执行
            			#如果fd 6中没有回车符了,进程阻塞在这儿
            {
                    gzip -9 $file
                    mv $file.gz /data1/error/$date/
                    echo >&6 #向fd6加上一个回车符
            } & #花括号体内的程序后台运行
    done
    wait
    exec 6>&- #关闭fd6
    

    wait命令表示等待前面的后台任务全部完成后才继续往下执行。

  • 相关阅读:
    全宁对医药行业销售代表的介绍
    effective c#读书笔记之二 静态成员的初始化
    自学笔记
    effective c#读书笔记之一
    如何判断表中是否有值
    领域驱动
    VIM 打造自己的VIM界面!
    Jqueryui的用法!
    php中io操作!
    php中Http请求!
  • 原文地址:https://www.cnblogs.com/xianzhedeyu/p/6373448.html
Copyright © 2020-2023  润新知