python文件锁实现进程单例
通过参数控制进程起停, 类似 httpd -k <start | stop>
#!/usr/bin/python
import os
import getopt
import fcntl
import time
import sys
def main():
while(True):
print os.getpid()
time.sleep(3)
def print_usage():
print 'usage'
if __name__ == "__main__":
pid_file = '/opt/nsfocus/mp-wafsl/tmp/daemon.pid'
optarg = 'null'
try:
opts, args = getopt.getopt(sys.argv[1:], "hk:", ['help', 'kk='])
for name,value in opts:
if name in ('-h'):
print_usage()
sys.exit(0)
if name in ('-k'):
optarg = value
except getopt.GetoptError:
print_usage()
sys.exit(2)
# Must use a+ here
fp = open(pid_file, 'a+')
is_running = False
try:
fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
is_running = True
if is_running and optarg == 'stop':
# stop running process
content = fp.read()
fp.close()
pid = int(content)
os.kill(pid, 9)
sys.exit(0)
elif optarg == 'start' and is_running is False:
fp.truncate()
fp.write(str(os.getpid()))
fp.flush()
main()
else:
sys.exit(0)