只允许运行一个Python脚本实例?

8

我有一个Python脚本,只想在一台机器上允许运行一次。我希望它能够打印类似于“错误,已经运行”这样的内容,如果已经在后台或不同的SSH会话中运行。我该怎么做?这是我的脚本。

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

附言:如果有影响的话,我正在使用CentOS 5。

3个回答

3

您可以使用pip install single安装single包,该包将使用咨询锁来确保仅运行一个命令实例而不留下过期的锁文件。

您可以像这样在脚本中调用它:

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

PIP命令未找到。我该如何在CentOS上执行此操作?使用yum没有单个软件包。 - CJ Sculti
你可能需要先执行 sudo easy_install pip 命令。然后,pip 将会自动从这里下载单个软件包:http://pypi.python.org/pypi/single/ - aculich
安装了pip之后,然后执行pip install single命令,我得到了这个http://pastebin.com/6MTmHkMT - CJ Sculti
你正在使用一个非常老的 Python 版本(2.4),它没有 walk_packages() 函数。你需要升级到至少 2.5 版本,但最好是升级到 2.7 版本。 - aculich

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

请参考此帖子获取答案 - 检查Python脚本是否正在运行


如果你只打算发布链接,最好也引用一些内容。 - icktoofay
关于这个问题,脚本是一个无限循环,因此它永远不会到达解锁的脚本结尾。 - CJ Sculti
1
我在你的评论后进行了编辑。 - fatrock92
这个“答案”仅仅是链接到另一个答案,并复制粘贴问题的代码,修改了两行以包括发帖人的姓名作为“变量”(无论如何都是无效的)。 - Tobias Kienzler

0
你可以在脚本开始时使用 flock 锁定现有文件。然后,如果同一脚本运行两次,则最新启动的脚本将被阻塞。另请参见 this question

关于这件事,脚本是一个无限循环,所以它永远不会到达脚本的结尾,也就无法解除锁定。 - CJ Sculti
你可以添加一个处理程序来处理 SIGTERMSIGQUIT 信号,该处理程序会清除用作循环条件的标志。 - Basile Starynkevitch
你能向我解释一下如何做这件事以及它的含义吗?因为我是 Python 的新手。 - CJ Sculti
您可以使用单个包装脚本来避免残留的锁文件。 - aculich
在Linux(和Unix)中,通常有一种称为信号的东西。当您运行kill程序时,它会发送一个SIGTERM(信号终止),当您按Ctrl-C停止在shell中运行的程序时,它会发送SIGINT(信号中断)。您的程序可以向操作系统注册回调以处理这些信号。然后,当您向程序发送信号时,它可以清理干净并退出。 - stonemetal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接