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)为人固执是好是坏?
有利有弊,如果对则天天向上,如果有偏差则越差越大。

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