bash 下如何实现 perl 中 seek 的功能?

因为日志处理需要,接触到 perl,虽然还未入门,但通过几个函数就可以发现其在文本处理上的威力确实名不虚传,更不用提正则表达式了。

假设有这样的应用场景:客户通过 ftp 客户端上传文件到接入端 ftp 服务器,接入端 ftp 服务器作为分布式存储系统的客户端,再将这些文件存入到后面的分布式存储服务器中。这个接入端 ftp 服务器要做的工作就是定时分析 ftp server(假设是 vsftpd,日志为 xferlog)的日志来获取客户上传的文件,再对这些文件做后续处理。客户上传时随时进行的,xferlog 的记录条数也随之增长。

perl 中通过 seek 函数可以很方便的做到,每一次脚本执行时,都将上一次脚本执行时 xferlog 的大小作为本次读操作的偏移量,用这个偏移量来调用 seek,本次处理完后再将该偏移量更新后存入到一个文件供下次脚本执行时读取。

再不判断异常分支就剁手

一两个月前刚进新公司时,正逢部门内部搞技术交流,每人轮流给部门其他人做一次自己擅长的技术培训。部门内几个老员工,有讲 Nginx 模块开发的,有讲视频编解码的,也有讲分布式存储系统的。由于我刚入行,对公司业务完全不熟,无奈之下,索性说我就讲讲 shell 编程吧。于是花了一天时间写了个十几页的 PPT,其中强调了脚本中对异常分支判断的重要性。脚本不是命令行的堆积,在交互模式下,一个命令的执行成功与否一目了然,根据这个结果我们会很自然的执行相应的命令;可是在脚本中,就不能这么想当然了,最简单的就是,cd 到一个目录,该目录是否存在?

可是今天还是犯了一个这样的错误。

好的设计真是一念之间吗?

说明:写这篇文章时,我还是一个从电子工程师转行到软件开发没多久的新手程序员,文章的记录现在看来真是让人汗颜,充满了浓浓的小作坊风格。但这就是成长不是吗?


背景描述

近几年 redis 应用的越来越多,正好现在手上的一个项目就用到了。简化一下需求,就是要实现一个 worker 程序,该程序所有的工作就是去 redis 中的一个任务链表 tasklist 里面去取任务,执行一些处理操作。

分工明确化

从始至终我们持有的一个观点就是,这个 worker 的功能要极度简化,就是去从 tasklist 中取任务,执行操作,并根据任务执行成功与否进行相关的结果记录。至于这个 tasklist 怎么来的,里面的任务是由谁来插入,worker 一概不管。这样的话,有几个好处:

  • worker 的角色明确,目标清晰。直接的好处就是代码容易编写。
  • 设计思想比较通用
  • tasklist 的插入在不同的场景下有不同的方式,最常见的是根据某个不断增长的 log 中取任务,插入任务。而这个工作很灵活,通过脚本语言更方便实现。

关于重试

worker 从 tasklist 中领取到一个任务来后,就开始执行相关的操作。如果一切顺利,就万事大吉。但在软件设计中,考虑异常情况几乎已经是广大码农们本能的反应了。不是我们天生心思缜密,而是这些都是通过一些惨痛的教训得来的。提到异常处理,在这里多说两句,讲一个亲身经历的例子:

记一个 here document 的坑

1. here document

在 bash 中,here document 经常用于一些需要交互性输入指令的程序中,例如登陆 ftp。例如:

ftp -n $HOST <<EOF
quote USER $USER  
quote PASS $PASS  
binary  
put $FileName  
quit  
EOF  

2. 踩到的坑

在工作中,涉及到很多对 redis 的操作,先简单的用 shell 脚本实现了一下。大概流程是这样的:shell 脚本调用 C 语言程序,根据 C 程序的输出,来操作 redis。因此主要涉及两件事:shell 脚本获取 C 程序输出,shell 脚本用 here document 操作 redis。

一张居住证的诞生

4 月 19 日从前一家公司离职,下一家公司的报道日期是 5 月 7 号。报到时需要带的材料中,有一项是“居住证”。

在网上找了广州市办理居住证的流程,发现各种说法不一,没有找到一个官方的说法。于是拉着一个在广州打工多年的亲戚带着我办。从亲戚口中得知,正常的流程应该是房东出具一份证明,拿着这份证明到居住地的社区继续弄齐材料,然后再到更高一级的机构去办理居住证。

我问那亲戚,是不是需要先把房子租了才能去办呢,他说他和他房东关系不错,跟房东说一声,直接先开到他的住处就可以了,房子慢慢再找,现在先去社区摸清楚到底什么流程,毕竟每年政策可能不一样。我们在城中村里综合交错的小巷子里找了很久,才找到社区工作站 A 的位置。

可是社区工作站的大门是紧锁着的。那天是 5 月 3 号,星期五,五一假期刚过,属于正常工作日。