如何比使用 cron 更智能地安排服务器作业?

Joh*_*ohn 15 scheduled-task cron

我每分钟运行一个作业来重新索引我网站的内容。

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

是否有另一种使用某种现有软件的方法可以让我每分钟执行一次作业,但如果该作业没有返回(即因为搜索引擎进程失败),则不会启动另一个实例?

use*_*517 27

问题不在于 cron——而在于你的工作。

您需要让您的工作与某种描述的锁进行交互。最简单的方法是让它尝试创建一个目录,如果成功则继续,否则退出。当您的作业完成并退出时,它应该删除准备下一次运行的目录。这是一个脚本来说明。

#!/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
Run Code Online (Sandbox Code Playgroud)

在一个终端中运行它,然后在 60 秒之前在另一个终端中运行它,它将以状态 1 退出。一旦第一个进程退出,您就可以从第二个终端运行它......

编辑:

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

* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job   
Run Code Online (Sandbox Code Playgroud)

将每分钟运行一次您的工作,但如果 flock 无法获得文件锁定,则会失败。

  • 使用常规文件需要多次操作,检查它是否存在,如果不存在则创建它。这为另一个进程创建文件留下了机会 - 混乱。mkdir 是一个原子操作,它可以工作并且您获得“锁定”,或者因为另一个进程已经拥有它而没有。 (9认同)
  • 可能是个愚蠢的问题,但是专门使用目录而不是常规文件有什么好处吗? (2认同)