python使用fcntl管理pidfile多进程文件锁

最近在折腾服务端,后端启动的时候,常常会遇到一个问题,由于启动方式不是通过标准的/etc/init.d/monitor start 启动的,是export PYTHONPATH=pwd;python monitor.py启动的。后期发现居然启动了N个进程。   这问题好解决,进程的启动关闭都需要统一入口,统一配置文件就可以了。  但是如果你的程序是被OOM了,或者是你自己kill掉,然后程序里又没有做signal的处理。那么会造成的问题就是monitor.pid 文件没有移除。 当我们想强制启动的时候,需要删除pidfile文件就可以了。

关于python fcntl文件锁的原文地址,http://xiaorui.cc/?p=2002



需要注意的是fcntl 对文件加锁是原子性的,不仅仅可以用于标注某进程的状态,还可以用于进程间文件操作的同步,比如python下多进程logging,这时候就可以封装一层logging,从而保证日志的完整性。 


简单说下python fcntl模块:

首先对该文件进行加密   


这样就对文件加锁了,如果有其他进程对test文件加锁,则不能成功,会被阻塞,但不会退出程序。
那么再来解锁:

看看fcntl的详细参数:


    如果指定LOCK_NB 参数,函数如果不能获得文件锁就立即返回,否则,函数会等待获得文件锁。LOCK_NB可以同LOCK_SH或LOCK_EX进行按位或(|)运算操作。 fcnt.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)   #这个意思是 ,判断是否有锁,没有的话,就立即退出。 
我把扩进程锁的需求,做成了一个开源的小模块。 看下面描述吧:


什么是python-pid ?

一个关于python pid管理的模块,借助于fcntl来给锁文件加入状态.

更多想法 .

本来是打算把进程名字和daemon都做进去的,但是考虑Pid本是个判断进程在不在的事,没必要让别的逻辑参合进来.

已经把这代码推送到github和pypi了 

Github 地址:  https://github.com/rfyiamcool/python-pid

Pypi 地址   :  https://pypi.python.org/pypi/python-pid


安装方法


方法1.

pip install python-pid
方法2

git clone git@github.com:rfyiamcool/python-pid.git
cd python-pid
python setup.py install
使用方法

可以在你的主函数加一个装饰器,可以传递pidfile的文件路径.


或者是直接调用,acquire是锁定,release()是释放


使用with关键词,调用enter , exit

fcntl的用处还是很多的,你可以在crontab里的脚本加入fcntl锁,这样就能保证同时只有一个进程在跑。



END… …

3 Responses

  1. peter 2015年9月18日 / 上午9:08

    如果进程被直接kill了,那么这个锁还在么

    • 峰云就她了 2015年9月18日 / 下午1:04

      试试不就知道了….进程没了,锁也就没了

    • 峰云就她了 2015年9月18日 / 下午1:05

      虽然pidfile文件还存在,但是他的flock没了

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">