3月 15

python中通过 pexpect 使用 rsync

  之前写了脚本,死循环调用inotifywait监控文件夹,如果文件有变动,则启动rsync进行同步。但是当前需求有点变化,文件要按照日期建文件夹进行存储,且文件变化很快,如果直接监控最顶级目录系统资源将消耗很大,所以考虑还是自写一下好,如果系统资源量变化大,且不用时时同步时可以根据文件变动对变动对文件进行记录,可以按照优先规则进行同步。
  官方网站 : http://trac.dbzteam.org/pyinotify
  系统要求:Linux kernel with inotify ≥ 2.6.13
Python ≥ 2.4

  直接使用easy_install安装非常简单
  # sudo easy_install pyinotify
  如果不能联网,则需要直接下载压缩包,进行编译安装。

  首先测试下是否可用:
  使用以下命令监控/tmp文件夹,
  # python -m pyinotify /tmp

在/tmp文件夹下新建1.txt,并随后进行删除。看到显示的记录如下:







  效果不错,继续向下进行。只要有创建、删除和关闭写就打印出变化的文件或目录,代码如下:

import  re
import pyinotify

wm = pyinotify.WatchManager()
mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_CLOSE_WRITE
class EventHandler(pyinotify.ProcessEvent):
    def process_IN_CREATE(self, event):
        self.rebuild(event) 

    def process_IN_DELETE(self, event):
        self.rebuild(event) 

    def process_IN_CLOSE_WRITE(self, event):
        self.rebuild(event)

    def rebuild(self, event):
        chang_name=re.compile(".+\.swp$|.+\.swx$|.+\.swpx$")
        if not chang_name.match(event.pathname):
            print event.pathname 

handler = EventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch('/tmp', mask, rec=True,auto_add=True  

notifier.loop()

  代码里使用正则表达式过滤因为使用vim打开文件产生的缓存文件。也可以用exclude_filter方法在官方文档中例子如下,但是我测试多次没有成功,所以直接用正则过滤。

# Exclude patterns from list
excl_lst = ['^/etc/apache[2]?/',
            '^/etc/rc.*',
            '^/etc/hostname',
            '^/etc/hosts',
            '^/etc/(fs|m)tab',
            '^/etc/cron\..*']
excl = pyinotify.ExcludeFilter(excl_lst)
# Add watches
res = wm.add_watch(['/etc/hostname', '/etc/cups', '/etc/rc0.d'],
                   pyinotify.ALL_EVENTS, rec=True, exclude_filter=excl)

  如果监控文件太多,需要对系统做一下修改sysctl -n -w fs.inotify.max_user_watches=16384。

3月 15

python 在 crontab 中的调用

python 在 crontab 中的调用

  使用python写了一个脚本,手动执行没有问题。需要自动运行,所以要配置到crontab中。举例脚本位置“/Data/script/test.py” ,其中包含读取操作系统、读取配置文件、写日志操作,使用root用户每5分钟执行一次。最初配置为:

*/5 * * * * /usr/local/bin/python /Data/script/test.py >/dev/null

  需要注意的是“*/5 * * * *”中间要用空格分隔。“/usr/local/bin/python”要根据使用的python脚本安装位置填写,通过观察定时任务失败。
  分析原因,crontab运行时的环境变量与ssh登录的环境变量不同,导致读取配置目录和文件失败。解决方法,写一个shell调用脚本,将脚本放在crontab中。脚本有一个参数“start”。
shell脚本为test.sh:

#! /bin/bash
#
# crontab shell python
#
# www.simonzhang.net
# email:simon-zzm@163.com
#
### END INIT INFO

. /etc/profile
cd /Data/script/

case "$1" in
  start)
      /usr/local/bin/python /Data/script/test.py start &
     ;;
  test)
      /usr/local/bin/python /Data/script/test.py test &
      ;;
  *)
        echo $"Usage: $0 {start|test}"
        exit 1
esac

exit 1

将脚本配置到crontab中运行成功,配置为:

*/5 * * * * /bin/sh /Data/script/test.sh start >/dev/null
3月 12

自问自答空想乔布斯

a)乔布斯在苹果中期为什么会离开苹果?
人际关系一定是没有搞好。

b)乔布斯一定是天才,否则后来苹果不会把他请回来。
必然会有自己独到之处,并与苹果保持着很好的联系。

c)为什么在离开苹果后创建的公司并不内有成为世界级企业?
个人能力再强也需要整个团队的支持。后期团队可能不太给力。

d)回到苹果,是否对苹果团队全面换血?
应该没有,如果有此能力,当初应该不会离开苹果。

e)乔布斯对产品要求精益求精。苹果的团队是否对产品要求也是精益求精。
有能力第一,但还要有协调能力。有协调能力还要有固执的性格,将自己
的判断彻底的执行。

f)为人固执是好是坏?
有利有弊,如果对则天天向上,如果有偏差则越差越大。

反思我应该怎么做?
和朋友和睦相处,与新朋旧友保持联系。认真思考,永不放弃。

3月 09

云技术和物联网之我见

  云技术和物联网是当下炒的比较热门的两个技术,我也随波逐流进行了肤浅的学习。本来没有打算写什么,但是在实际中遇到很多人对技术的认识我和我的认知差距很大,所以我觉得有必要通过写字,来记录一下当前的想法,以便后期反省使用。
  首先看看什么是云,云到现在也没有很明确的定义,我把当前所见过对云的定义总结一下。就是大规模计算机集群,用户可以根据自己需要资源量来进行定制化使用。随之而来的问题是,google、百度、亚马逊、雅虎等在很多年前都已部署了集群,为什么没有提出云概念?电信公司使用大规模计算机进行服务,我们按照需要进行使用付费,为什么通信行业没有提出云的概念?我的答案,电信行业的收费模式已经形成,并且被公认。而以互联网为基础的大型公司有剩余的网络、设备和技术资源,可以简单的包装,便能为当前需要但又不是长期需要的客户进行服,这种服务需要的是技术的噱头和简单的盈利方案,云产生了。云的技术已经在大型公司相当完善,所以云应该和传统的叫法结合。云技术是整体名称,细分可以分为云计算、云存储、云流量、云安全等等。云计算,是以cpu为计费主体的方案。云存储是以存储为主体的方案,当然存储是分布式存储,也必须用到计算的部分,但计算起到的作用是为存储选址的作用。举个实际的例子,cpu就是车间,cpu产出信息,车间产出物品,cpu产出存在磁盘,车间产出存在仓库。可以通过车间产出运输可以找到物品的存放仓库,但是仓库可以转给这个车间用,也可以是其它的仓库。车间和仓库都属于一个厂,但是仓库绝对不是车间下层的一部分。如果还要具体讨论,还需要了解,什么叫数据,什么叫信息、什么叫计算这些基础知识就不废话了,有空查查看。如果大家很熟悉分布式那云基本就没有问题了,我对云的热情也减少了不少。
  再来说物联网。物联网的定义很清晰,通过射频识别(RFID)、感应器、全球定位系统、控制器、短距离通信技术,按约定的协议,把任何物品与互联网相连接,从而达到人与物,物与物之间的连接。物联网的传出是以所有的通信网络为基础,是信息交换和通信的一种网络概念。当前的ETC通道、移动医疗、远程视频等都属于物联网的范畴。物联网正在高速的发展,中国也在大力的打造物联网,所以物联网应该是发展的趋势。在此就不费唇舌了。