异想天开

What's the true meaning of light, Could you tell me why

Bug一则

日期:2015-01-30 17:07:17
  
最后更新日期:2015-01-30 17:07:17
【工作】
写了如下脚本:
[code lang="cpp"]
#encoding: utf-8
#!/usr/bin/python
import os
import time
import sys
import fcntl
def single_instance():
try:
lock_file = open('/data/my.lock', 'w+')
fcntl.lockf(lock_file.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
except Exception, err:
print 'running another instance?',err
sys.exit(0)

class AutoSingle:
def __init__(self,filename):
self._fp=open(filename,"w")
try:
flock(self._fp,LOCK_EX | LOCK_NB)
except Exception,e:
#系统已经在运行
print 'already run'
sys.exit(0)

if __name__=='__main__':
single_instance()
# g_lock=AutoSingle("/tmp/test.lock")
print 'get lock'
time.sleep(1000)
sys.exit(0)
[/code]
这个是用来验证文件锁的例子,single_instance是从某处copy过来的。但是这个脚本文件锁本没有起作用,于是开始各种调试。lsof查看/data/my.lock被哪个进程打开,strace跟踪命令执行,包括使用libc提供fcntl接口直接使用文件锁,发现libc直接使用文件锁正常,而该脚本不正常。后面同事指出,lock_file是临时变量,文件在函数退出后,被关掉了改文件。囧,这么低级的问题。 其实strace的输出给过我提示:
[code lang="cpp"]
open("/data/my.lock", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}) = 0
close(3)
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5c40a1a000
write(1, "get lock\n", 9get lock
) = 9
select(0, NULL, NULL, NULL, {1000, 0}
[/code]
close(3)!关掉了。后面另外的朋友说,在python 2.7的时候,这个程序可以锁住,感觉锁住了,才是大问题,作用域退出了,还不关闭文件。教训,不轻易使用未验证的code。