2012-09-01 100 views
7

我有一个python脚本,我想只允许在一台机器上运行一次。如果它已经在运行,无论它在后台运行还是在不同的ssh会话中运行,我都希望它打印“Error,already running”。我将如何做到这一点?这是我的脚本。只允许一个python脚本实例?

import urllib, urllib2, sys 
num = sys.argv[1] 
print 'Calling' 
phones = [ 
'http://phone1/index.htm', 
'http://phone2/index.htm', 
'https://phone3/index.htm', 
'https://phone4/index.htm', 
'https://phone5/index.htm' 
] 
data = urllib.urlencode({"NUMBER":num, "DIAL":"Dial", "active_line":1}) 
while 1: 
    for phone in phones: 
     try: 
      urllib2.urlopen(phone,data) # make call 
      urllib2.urlopen(phone+"?dialeddel=0") # clear logs 
     except: pass 

P.S我正在使用CentOS 5。

回答

3
  1. 您可以对该文件实施锁定。
  2. 在执行开始时创建一个临时文件,并在运行脚本之前检查该文件是否存在。

参考这个职位答案 - Check to see if python script is running

+0

如果你要发布只是一个链接,你可能想从它引用了一下为好。 – icktoofay

+1

感谢您的提示。 – fatrock92

+0

关于这一点的事情是,脚本是一个无限循环,所以它永远不会到达删除锁定脚本的末尾。 –

0

你可以锁定使用例如现有的文件flock在您的脚本开始。然后,如果相同的脚本运行两次,则最新的启动会阻止。另见this question

+0

关于这一点的事情是,脚本是一个无限循环,所以它永远不会到达删除锁定脚本的末尾。 –

+0

您可以为'SIGTERM'或'SIGQUIT'添加一个处理程序,它清除用作循环条件的fleg。 –

+0

你能向我解释如何做到这一点?由于我是python –

2

您可以安装single包与pip install single,它将使用咨询锁确保只有一个命令的单个实例可以运行,而不会丢失过时的锁文件。

你可以调用它在你的脚本是这样的:

single.py -c long-running-script arg1 arg2 
+0

未找到PIP命令。我如何在centos上做到这一点?没有与yum单独的包裹 –

+0

您可能必须先执行'sudo easy_install pip'。然后pip将从这里自动下载单个软件包:http://pypi.python.org/pypi/single/ – aculich

+0

安装pip之后,然后做pip安装单个,我得到这个http://pastebin.com/6MTmHkMT –

相关问题