前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux shell 多进程和文件队列处理任务

Linux shell 多进程和文件队列处理任务

作者头像
Dylan Liu
发布2019-07-01 11:39:58
1.9K0
发布2019-07-01 11:39:58
举报
文章被收录于专栏:dylanliudylanliu

原先的做法

用一个shell脚本遍历需要拉取的机器和需要拉取天数的日志(两者可配置),通过scp命令将应用服务器上的日志拉取到日志服务器上,然后压缩存盘。再将过期的日期删除

存在的问题

  • 两个for循环相当于O(n^2)的复杂度
  • 顺序执行这么多的任务没有充分利用其服务器的资源
  • 拉取的文件未压缩,导致网络流量浪费
  • 任务都混杂在一个文件中,不清晰
  • 如果任务的执行时间超过1天,会对定时任务造成影响

想到的解决方法

  • 将串行任务执行改成并行任务执行
  • 任务分解到不同的文件中,用专门的处理进程处理
  • 先压缩后拉取,然后删除掉应用服务器上的压缩文件

前期准备

由于对shell以前只是停留在偶尔用的程度,许多知识都需要现查,因此又去学习了一遍,其中包括shell中多进程任务执行,文件监听处理,以及常用的Linux命令

  • Linux多任务执行 (多任务执行|http://www.cnblogs.com/xudong-bupt/p/6079849.html) (多进程并发|http://www.cnblogs.com/stevendes1/p/6725898.html) 我第一个看到的是第一个博客,不过他写的多进程程序里有问题,需要把echo >&6挪到任务执行后面,也就是大括号里面。第二个博客讲了原理,也有代码,很棒。
  • 文件监听处理 以前用kafka做日志处理时,记得有一个可以使用tail来创建生产者,因此朝着这方面找了下资料,确实可以这么做 shell function dosth(){} tail -f -n 100 $taskFile | while read name file do read -u6 { dosth $name $file echo >&6 # 当进程结束以后,再向fd6中加上一个回车符 } & done
  • 其他 Linux函数调用,scp,gzip,echo等命令看了下他们的man页,做起来更有信心

动手

  • 任务分类 目前有两个任务,一是拉取日志,二是删除过期日志,因此使用两个文件队列来分别表示这两个任务
  • shell处理 一个用于生产需要消费的数据(crontab使用),一个实现拉取日志,一个实现删除过期日志,拉取日志过程中产生的压缩文件也写到删除过期日志任务队列中,由它来专门处理 具体脚本可见GitHub(shell|https://github.com/SixPenny/Scripts/tree/master/pull-logs)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原先的做法
  • 存在的问题
  • 想到的解决方法
  • 前期准备
  • 动手
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档