【问题标题】:Allow only one instance of python script? [duplicate]只允许一个 python 脚本实例? [复制]
【发布时间】:2012-08-27 05:44:06
【问题描述】:

我有一个 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

P.S 如果这很重要,我正在使用 CentOS 5。

【问题讨论】:

    标签: python linux locking singleton centos


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

    请参阅此帖子以获取答案-Check to see if python script is running

    【讨论】:

    • 如果您只想发布一个链接,您可能还想引用它。
    • 关于那个的事情是,脚本是一个无限循环,所以它永远不会到达脚本的末尾,即解除锁定。
    • 我在您发表评论后对其进行了编辑。
    • 这个“答案”只是链接到另一个答案并复制粘贴问题的代码,修改了两行以将海报的名称包含为“变量”(无论如何都是无效的)。
    【解决方案2】:

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

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

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

    【讨论】:

    • PIP 命令未找到。我将如何在 centos 上执行此操作? yum没有包单
    • 您可能必须先执行sudo easy_install pip。然后 pip 会自动从这里下载单个包:pypi.python.org/pypi/single
    • 安装 pip 后,然后执行 pip install single,我得到了这个pastebin.com/6MTmHkMT
    • 您使用的是非常旧的python (2.4) 版本,它没有walk_packages()。您需要至少升级到 2.5,但如果可能,最好升级到 2.7。
    【解决方案3】:

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

    【讨论】:

    • 关于那个的事情是,脚本是一个无限循环,所以它永远不会到达脚本的末尾,即解除锁定。
    • 您可以为SIGTERMSIGQUIT 添加一个处理程序,以清除用作循环条件的fleg。
    • 您能向我解释一下如何执行此操作以及它的含义吗?因为我是 python 新手
    • 您可以使用single wrapper script 来避免留下陈旧的锁定文件。
    • @CJSculti 在 Linux(和 unix)中,通常有一种叫做信号的东西。当您运行 kill 程序时,它会发送 SIGTERM(信号终止),当您按 Ctrl-C 停止在 shell 中运行的程序时,它会发送 SIGINT(信号中断)。您的程序可以向操作系统注册回调以处理这些信号。然后,当您向程序发送信号时,它可以很好地清理并退出。
    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多