一分钟cron,确保只有一个实例

有没有办法每分钟运行一个脚本(或2或5等),但只有在它尚未运行?

我们有一套脚本需要每分钟运行一次。 有时他们可能会在一秒钟内开始和结束,其他时间可能会持续5分钟。

我们目前避免同时执行的方法是在每个脚本中设置一个is_running标志,如果它仍然启用,退出。 但这有点不可靠(即致命的错误会导致标志在脚本停止后保持启用状态)。

我们可以写自己的小经理,但我想知道是否有一个更现代化的解决scheme。

更好的方法是使用flock而不是pidfile。 检查手册页: flock(1) 。 优点是不pipe一个过程如何完成/死亡,锁都随之消失。

我倾向于同意华纳的pid文件的答案。 但是,Anacron的下列function是否完成了这个function?

 -s Serialize execution of jobs. Anacron will not start a new job before the previous one finished. 

我没有自己testing过,我没有发现anacron的文件足够透彻。

如果你想特别懒;-)你可以让脚本退出,如果通过ps输出greps返回进程运行。 但是一个锁/ PID文件是最好的。

这是这种方法的适当解决scheme。 通常情况下,将使用一个pid文件,并对stream程进行pidtesting以确保其运行。 如果失效,locking文件将被删除,并且该进程将无论如何运行。

任何额外的智能通常都会作为守护进程写在软件本身中,而不是在cron中运行。

如果您的脚本使用支持flock(2)系统调用的语言编码,那么您也可以通过函数调用来locking(lock)文件。 例:

  • Perl: 羊群
  • Python: fcntl.flock

如果你坚持使用Bash或者其他不支持这种脚本语言的脚本语言,那么已经提出的flock(1)解决scheme也可以。

PS在任何情况下,您都应该只创build一个单独的locking文件(如果它不存在),并且不要删除它。 目录“/ var / lock”是这样的文件的好地方。

这是一个解决scheme,如果你的脚本运行在Python中(或者你可以创build一个python命令来运行下一个命令之前) – 上周遇到了这个确切的问题,虽然我find了一些很好的解决scheme,但我决定做一个非常简单和干净的Python包,并将其上传到PyPI。 你当然可以locking__file__ ,不必考虑给它一个自定义的资源名称来locking。

安装: pip install quicklock

使用它非常简单:

 [nate@Nates-MacBook-Pro-3 ~/live] python Python 2.7.6 (default, Sep 9 2014, 15:04:36) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from quicklock import singleton >>> # Let's create a lock so that only one instance of a script will run ... >>> singleton('hello world') >>> >>> # Let's try to do that again, this should fail ... >>> singleton('hello world') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/nate/live/gallery/env/lib/python2.7/site-packages/quicklock/quicklock.py", line 47, in singleton raise RuntimeError('Resource <{}> is currently locked by <Process {}: "{}">'.format(resource, other_process.pid, other_process.name())) RuntimeError: Resource <hello world> is currently locked by <Process 24801: "python"> >>> >>> # But if we quit this process, we release the lock automatically ... >>> ^D [nate@Nates-MacBook-Pro-3 ~/live] python Python 2.7.6 (default, Sep 9 2014, 15:04:36) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from quicklock import singleton >>> singleton('hello world') >>> >>> # No exception was thrown, we own 'hello world'! 

看看: https : //pypi.python.org/pypi/quicklock