之前一段时间,发现线上日志服务器总是会突然丢失日志,碰到问题时搞的很被动。联系运维同学,又总是被往后推(后来看了一下日志归档脚本,运维同学写的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命令表示等待前面的后台任务全部完成后才继续往下执行。

bash实现多进程运行的更多相关文章

  1. [C++]Linux之多进程运行代码框架

    声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0  多进程代码框架示例 /* @url: ...

  2. Pytest系列(30)- 使用 pytest-xdist 分布式插件,如何保证 scope=session 的 fixture 在多进程运行情况下仍然能只运行一次

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 背景 使用 pytest-xdis ...

  3. 使用sh运行bash脚本的奇怪问题

    在同一个文件夹下有两个脚本.a.sh和b.sh,脚本内容例如以下: a.sh: echo "test for a" source b.sh b.sh: echo "tes ...

  4. Bash脚本实现批量作业并行化

    http://jerkwin.github.io/2013/12/14/Bash%E8%84%9A%E6%9C%AC%E5%AE%9E%E7%8E%B0%E6%89%B9%E9%87%8F%E4%BD ...

  5. 【转】Bash脚本实现批量作业并行化

    首先附上自己常用的代码 ---------------------------------------------------------------------------------------- ...

  6. BASH的保护性编程技巧

    BASH的保护性编程技巧   shell常用逻辑判断 -b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目 ...

  7. 服务器CGI运行机制

    CGI概括: 定义 通用网关接口(Common Gateway Interface)是HTTP服务器与你的或其它机器上的程序进行"交谈"的一种工具,其程序须运行在网络服务器上. 功 ...

  8. React-Native运行知乎日报遇到的问题

    研究几天RN(React-Native)后,跟着官方的demo做了一下电影图片显示的那个,但是总感觉官方的demo欠缺点什么,所以找来找去找到了RN版的知乎日报,话说知乎日报什么版的都有,不信你们上网 ...

  9. 编写运行R脚本

    1.在后台运行R 1.1 创建file.R文件 1.2 在文件首行键入: #! /path/to/Rscript 1.3 在下面的行中,键入R代码 1.4 保存(记得有png(),jpeg(),... ...

随机推荐

  1. Learn from Architects of Buildings

     Learn from Architects of Buildings Keith Braithwaite Architecture is a social act and the material ...

  2. MAVEN Error: Using platform encoding (GBK actually) to copy filtered resources.....

    环境:Maven3.2.5+MyEclipse 2015CI 现象:在Maven编译过程中出现错误信息:Using platform encoding (GBK actually) to copy f ...

  3. 如何把canvas元素作为网站背景总结详解

    如何把canvas元素作为网站背景总结详解 一.总结 一句话总结:最简单的做法是绝对定位并且z-index属性设置为负数. 1.如何把canvas元素作为网站背景的两种方法? a.设置层级(本例代码就 ...

  4. PHP解决约瑟夫环问题

    PHP解决约瑟夫环问题 一.总结 二.PHP解决约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到 ...

  5. TCP套接字编程模型及实例

    摘要:     本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...

  6. get_mysql_conn_info.py

    #!/usr/bin/env python#-*- encoding: utf8 -*- import xlrd """此模块作用:从excel文件获取数据库连接信息,第 ...

  7. 9、getopt的用法,被用来解析命令行选项参数

    #include <unistd.h>       extern char *optarg;  //选项的参数指针       extern int optind,   //下一次调用ge ...

  8. (三)RabbitMQ消息队列-Centos7下安装RabbitMQ3.6.1

    原文:(三)RabbitMQ消息队列-Centos7下安装RabbitMQ3.6.1 如果你看过前两章对RabbitMQ已经有了一定了解,现在已经摩拳擦掌,来吧动手吧! 用什么系统 本文使用的是Cen ...

  9. php实现求最小的k个数(日常出错很容易是分号或者$符号忘记写了)

    php实现求最小的k个数(日常出错很容易是分号或者$符号忘记写了) 一.总结 日常出错很容易是分号或者$符号忘记写了 二.php实现求最小的k个数 题目描述 输入n个整数,找出其中最小的K个数.例如输 ...

  10. ZOJ 3209 Treasure Map DLX

    用最少的矩阵覆盖n*m的地图.注意矩阵不能互相覆盖. 这里显然是一个精确覆盖,但因为矩阵拼接过程中,有公共的边,这里须要的技巧就是把矩阵的左边和以下截去一个单位. #include <stdio ...