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中的电子邮件),您可以决定是否有管理员可以查看的内容,程序要处理的另一个案例或其他内容.
| 归档时间: |
|
| 查看次数: |
5079 次 |
| 最近记录: |