1436天前2018-10-24 21:38:34 |    抢沙发  2929 
在写python脚本的过程你有没有遇到过这样的需求?要防止同一时间系统里面这个脚本只能运行一次,不能同时运行。我碰到过两次,那么这样的需求要怎么来实现呢?不要着急请跟随静心一起来实现禁止python脚本重复执行的功能吧。

python

实现方法分为两种:

第一种是利用端口占用来实现防止重复执行的方式:

代码如下:

  HOST='127.0.0.1'
  PORT=5555
  try:
    s = socket.socket()
    s.bind((HOST, PORT))
    main()
    s.close()
  except KeyboardInterrupt:
    s.close()
  except:
    print(' * already has an instance, so exit.')
    exit(0)
解释一下:

原理是程序一执行就会去监听指定的5555端口,如果没有执行的话那么这个端口是可以被监听成功的,相反如果这个端口监听失败,就说明端口已经被占用,那么程序就会报错,这个时候就会直接跳到except:下面去执行。这样程序也就结束了,不会重复执行了。

其中main()是你要执行的主函数。这个里面就是你要实现的业务逻辑代码。


第二种方式就是利用进程ID的形式来判断:

代码:

#!/usr/bin/python
#coding:utf-8
import os
import psutil
import time

def write_pid():
    pid = os.getpid()
    fp = open("pid.log",'w')
    fp.write(str(pid))
    fp.close()

def read_pid():
    if os.path.exists("pid.log"):
        fp = open("pid.log",'r')
        pid = fp.read()
        fp.close()
        return pid
    else:
        return False

def write_log(log_content):
    time_now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    log_content = time_now+"---->"+log_content+os.linesep
    fp = open('recognition.log','a+')
    fp.write(log_content)
    fp.close()

def run():
    pid = read_pid()
    #print pid
    pid = int(pid)
    if pid:
        running_pid = psutil.pids()
        if pid in running_pid:
            log_content =  "process is running..."
            write_log(log_content)
        else:
            write_pid()
            time.sleep(20)
    else:
        write_pid()
        time.sleep(20)

if __name__ == "__main__":
    run()

这个方法会在脚本执行目录产生两个文件一个是记录进程ID的文件,一个是日志文件。好了教程就到这里吧,我也该回家咯!

发表评论

暂无评论

登录

忘记密码 ?

切换登录

注册

扫一扫二维码分享