如何比cron更聪明地安排服务器的工作?

我每分钟都会做一份工作来重新编制我的网站的内容。

今天,search引擎死了,当我login时,有数百个由cron启动的孤立进程。

有没有另外一种方式使用某种现有的软件来让我每分钟执行一个作业,但是如果这个作业没有返回(即因为search引擎进程失败了)而不会启动另一个实例呢?

    问题与cron不是一回事 – 这是你的工作。

    你需要让你的工作与一些描述的锁相互作用。 最简单的方法是试图创build一个目录,如果成功继续,如果不是退出。 当您的工作完成并退出时,应该删除准备下一次运行的目录。 这是一个脚本来说明。

    #!/bin/bash function cleanup { echo "Cleanup" rmdir /tmp/myjob.lck } mkdir /tmp/myjob.lck || exit 1 trap cleanup EXIT echo 'Job Running' sleep 60 exit 0 

    在一个terminal运行这个,然后在60秒之前运行它在另一个terminal将退出状态1.一旦第一个进程退出,你可以从第二个terminal运行…

    编辑:

    正如我刚刚了解羊群,我想我会更新这个答案。 羊群(1)可能更容易使用。 在这种情况下, flock -n似乎是合适的,例如

     * * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job 

    会每分钟运行你的工作,但会失败,如果鸡群无法获得文件locking。

    一种方法是让你的reindex脚本创build一个locking文件,以便它可以检查是否已经有一个正在运行的脚本实例。 您还可以添加一些exception处理,以查看search引擎是否已启动并正在运行。

    更复杂的select是使用Resque和Resque-scheduler之类的任务队列:

    https://github.com/blog/542-introducing-resque

    https://github.com/bvandenbos/resque-scheduler#readme

    还有Qu和Sidekiq:

    https://github.com/bkeepers/qu

    https://github.com/mperham/sidekiq

    是的,这些都是以Ruby为导向的,但是你可以用自己select的语言寻找“resque”之类的东西。

    另一种快速设置的方法是在机器启动时启动一个shell脚本(cron可以通过' @reboot /path/to/my/script.sh ',然后重新启动cron来启动它)有这样的东西在里面

     #!/bin/sh /opt/bin/run-site-index sleep 60 exec $0 

    脚本一直在运行,而且你只能启动一个 – 多less个脚本可以同时运行 – 不过是这样。 那里的一些智能还可以检查索引器是否正在运行,如果没有,重新启动,或者尝试修复/通知某人这个问题。

    而不是使用cron来做这件事,我会把你的工作作为一个循环运行的服务来构build,最后一步睡60秒,或者在这个过程的不同时间点更频繁地hibernate一段时间,以帮助分散负载更均匀。