仅在未运行时使用cron运行python脚本

Hyp*_*eus 18 python cron flock

我需要每分钟运行一个python脚本(job.py).如果该脚本已在运行,则不得启动该脚本.它的执行时间可能在10秒到几个小时之间.

所以我放入我的crontab:

* * * * * root cd /home/lorenzo/cron && python -u job.py 1>> /var/log/job/log 2>> /var/log/job/err
Run Code Online (Sandbox Code Playgroud)

为了避免在脚本运行时启动脚本,我使用flock().

这是脚本(job.py):

import fcntl
import time
import sys

def doIncrediblyImportantThings ():
    for i in range (100):
        sys.stdout.write ('[%s] %d.\n' % (time.strftime ('%c'), i) )
        time.sleep (1)

if __name__ == '__main__':
    f = open ('lock', 'w')
    try: fcntl.lockf (f, fcntl.LOCK_EX | fcntl.LOCK_NB)
    except:
        sys.stderr.write ('[%s] Script already running.\n' % time.strftime ('%c') )
        sys.exit (-1)
    doIncrediblyImportantThings ()
Run Code Online (Sandbox Code Playgroud)

这种方法似乎有效.

有什么我想念的吗?我可以使用这种方法遇到任何麻烦吗?

是否有更多建议或"正确"的方法来实现这种行为?

我感谢你的任何建议.

Jea*_*one 12

我要做的唯一建议是使您的异常处理更加具体.您不希望fcntl有一天意外删除导入并隐藏该NameError结果.始终尝试捕获您想要处理的最具体的异常.在这种情况下,我建议像:

import errno

try:
    fcntl.lock(...)
except IOError, e:
    if e.errno == errno.EAGAIN:
        sys.stderr.write(...)
        sys.exit(-1)
    raise
Run Code Online (Sandbox Code Playgroud)

这样,锁定无法获得的任何其他原因都会出现(可能是因为您使用的是cron中的电子邮件),您可以决定是否有管理员可以查看的内容,程序要处理的另一个案例或其他内容.