zoukankan      html  css  js  c++  java
  • 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命令表示等待前面的后台任务全部完成后才继续往下执行。

  • 相关阅读:
    sql server 数据查询基础
    sqlserver 用SQL语句操作数据
    sql server 用表组织数据
    sql server 程序的集散地 数据库
    JAVA 面向对象 File I/O
    JAVA 面向对象 多线程
    JAVA 面向对象 集合框架
    JAVA 面向对象 异常
    js内置对象、定时函数、document对象
    DOM
  • 原文地址:https://www.cnblogs.com/xianzhedeyu/p/6373448.html
Copyright © 2011-2022 走看看